52 votes

Comment obtenir la liste de tous les objets initialisés et des définitions de fonctions vivantes en python ?

Disons que dans le shell python (IDLE), j'ai défini des classes, des fonctions et des variables. J'ai également créé des objets de ces classes. Puis j'ai supprimé certains objets et en ai créé d'autres. À un moment ultérieur, comment puis-je savoir quels sont les objets, variables et définitions de méthodes actuellement actifs dans la mémoire ?

65voto

Lennart Regebro Points 52510

Sí.

>>> import gc
>>> gc.get_objects()

Non pas que vous trouverez ça utile. Il y a un lot d'entre eux. :-) Plus de 4000 juste quand vous commencez Python.

Toutes les variables actives localement sont peut-être un peu plus utiles :

>>> locals()

Et celui qui est actif au niveau mondial :

>>> globals()

(Notez que "globalement" en Python n'est pas vraiment mondial en tant que tel. Pour cela, vous avez besoin du gc.get_objects() ci-dessus, et qu'il est peu probable que vous trouviez jamais utile, comme mentionné).

10voto

skjerns Points 320

La fonction gc.get_objects() ne trouvera pas tous les objets, par exemple les tableaux numpy ne seront pas trouvés.

import numpy as np
import gc

a = np.random.rand(100)
objects = gc.get_objects()
print(any[x is a for x in objects])
# will not find the numpy array

Vous aurez besoin d'une fonction qui développe tous les objets, comme expliqué aquí

# code from https://utcc.utoronto.ca/~cks/space/blog/python/GetAllObjects
import gc
# Recursively expand slist's objects
# into olist, using seen to track
# already processed objects.
def _getr(slist, olist, seen):
  for e in slist:
    if id(e) in seen:
      continue
    seen[id(e)] = None
    olist.append(e)
    tl = gc.get_referents(e)
    if tl:
      _getr(tl, olist, seen)

# The public function.
def get_all_objects():
  """Return a list of all live Python
  objects, not including the list itself."""
  gcl = gc.get_objects()
  olist = []
  seen = {}
  # Just in case:
  seen[id(gcl)] = None
  seen[id(olist)] = None
  seen[id(seen)] = None
  # _getr does the real work.
  _getr(gcl, olist, seen)
  return olist

Maintenant, nous devrions être en mesure de trouver le plus objets

import numpy as np
import gc

a = np.random.rand(100)
objects = get_all_objects()
print(any[x is a for x in objects])
# will return True, the np.ndarray is found!

5voto

NPE Points 169956

Essayez globals()

5voto

user8369515 Points 64

Et si dir() qui affichera les objets instanciés sous forme de liste ? Je viens de l'utiliser à l'instant : [x for x in dir() if x.lower().startswith('y')]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X