web-dev-qa-db-fra.com

print python trace de pile sans exception levée

Quelque chose se passe avec l'une des variables d'instance de ma classe. Je veux faire de la variable une propriété, et chaque fois qu'elle est accessible, je veux imprimer la trace de la pile de tout le code menant à ce point, afin que je puisse voir où elle est gâchée. Comment imprimer la trace de pile lorsqu'aucune exception n'a été déclenchée? Je sais que s'il y a une exception, je peux faire quelque chose comme traceback.format_tb(sys.exc_info()[2]).

De plus, ce qui pourrait être utile, c'est d'imprimer uniquement les 3-4 derniers niveaux, car les premiers ne seront probablement pas aussi intéressants.

61
Claudiu

traceback.print_stack() :

>>> def f():
...   def g():
...     traceback.print_stack()
...   g()
...
>>> f()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in f
  File "<stdin>", line 3, in g

Edit: Vous pouvez également utiliser extract_stack , prendre une tranche (par exemple stack[5:] Pour exclure les 5 premiers niveaux) et utiliser format_list pour obtenir une trace de pile prête à imprimer ('\n'.join(traceback.format_list(...)))

80
user395760

Au lieu d'imprimer sur stdout, si vous avez besoin d'une chaîne pour passer à un enregistreur, vous pouvez utiliser:

''.join(traceback.format_stack())

Notez que traceback.format_stack () renvoie le stacktrace sous forme de liste formatée de chaînes, vous pouvez donc le découper comme vous le souhaitez. Pour obtenir les derniers éléments du stacktrace, vous pouvez faire:

''.join(traceback.format_stack()[-N:])

Où N est le nombre de niveaux qui vous intéressent.

4
rouble