Débogage Python: obtenir le nom du fichier et le numéro de ligne à partir desquels une fonction est appelée?

je suis en train de construire un système assez complexe en Python, et quand je débogue, je mets souvent des instructions d'impression simples dans plusieurs scripts. Pour garder une vue d'ensemble, je veux souvent aussi imprimer le nom du fichier et le numéro de ligne où se trouve le relevé d'impression. Je peux bien sûr le faire manuellement, ou avec quelque chose comme ceci:

from inspect import currentframe, getframeinfo
print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', 'what I actually want to print out here'

qui imprime quelque chose comme:

filenameX.PY: 273 - ce que je veux réellement imprimer ici

pour simplifier, je veux pouvoir faire quelque chose comme:

print debuginfo(), 'what I actually want to print out here'

alors je l'ai mis dans une fonction quelque part et j'ai essayé de faire:

from debugutil import debuginfo
print debuginfo(), 'what I actually want to print out here'
print debuginfo(), 'and something else here'

malheureusement, j'obtiens:

debugutil.py:3 - what I actually want to print out here
debugutil.py:3 - and something else here

il imprime le nom du fichier et le numéro de ligne sur lesquels j'ai défini la fonction, au lieu de la ligne sur laquelle j'appelle debuginfo(). C'est évident, parce que le code est situé dans le debugutil.py fichier.

Donc ma question est en fait: Comment puis-je obtenir le nom de fichier et le numéro de ligne à partir desquels cette fonction debuginfo() est appelée? Tous les conseils sont les bienvenus!

18
demandé sur kramer65 2014-06-26 23:47:30

2 réponses

La fonction inspect.stack() renvoie une liste de cadre enregistre, en commençant par l'appelant et de votre déménagement, que vous pouvez utiliser pour obtenir les informations que vous souhaitez:

from inspect import getframeinfo, stack

def debuginfo(message):
    caller = getframeinfo(stack()[1][0])
    print "%s:%d - %s" % (caller.filename, caller.lineno, message)

def grr(arg):
    debuginfo(arg)

grr("aargh")

Sortie:

example.py:8 - aargh
38
répondu Zero Piraeus 2014-06-26 20:16:05

il suffit de mettre le code que vous avez posté dans une fonction:

from inspect import currentframe, getframeinfo

def my_custom_debuginfo(message):
    print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', message

et ensuite l'utiliser comme vous voulez:

# ... some code here ...
my_custom_debuginfo('what I actually want to print out here')
# ... more code ...

je vous recommande de mettre cette fonction dans un module séparé, de cette façon vous pouvez la réutiliser chaque fois que vous en avez besoin.

0
répondu Raydel Miranda 2014-06-26 19:56:34