web-dev-qa-db-fra.com

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

Disons que dans le python Shell (IDLE), j'ai défini certaines classes, fonctions, variables. J'ai également créé des objets des classes. Ensuite, j'ai supprimé certains objets et en ai créé d'autres. Plus tard À un moment donné, comment savoir quels sont les définitions d’objets, de variables et de méthodes actuellement actifs dans la mémoire?

43
user235273

Oui.

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

Vous ne trouverez pas cela utile. Il y en a beaucoup d'entre eux. :-) Plus de 4000 au moment où vous démarrez Python.

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

>>> locals()

Et celui qui est actif dans le monde:

>>> globals()

(Notez que "globalement" dans Python n'est pas vraiment global en tant que tel. Pour cela, vous avez besoin de la gc.get_objects() ci-dessus, et que vous ne seront probablement jamais utiles, comme mentionné).

53
Lennart Regebro

La fonction gc.get_objects() ne trouvera pas tous les objets, par ex. 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é ici

# 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 la plupart 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!
6
skjerns

Essayez globals()

5
NPE