64 votes

Comment déterminer le numéro de fichier, de fonction et de ligne ?

En C++, je peux imprimer une sortie de débogage comme ceci :

 printf(
   "FILE: %s, FUNC: %s, LINE: %d, LOG: %s\n",
   __FILE__,
   __FUNCTION__,
   __LINE__,
   logmessage
);

Comment puis-je faire quelque chose de similaire en Python ?

84voto

junjanes Points 4858

Il existe un module nommé inspect qui fournit ces informations.

Exemple d'utilisation :

 import inspect

def PrintFrame():
  callerframerecord = inspect.stack()[1]    # 0 represents this line
                                            # 1 represents line at caller
  frame = callerframerecord[0]
  info = inspect.getframeinfo(frame)
  print(info.filename)                      # __FILE__     -> Test.py
  print(info.function)                      # __FUNCTION__ -> Main
  print(info.lineno)                        # __LINE__     -> 13

def Main():
  PrintFrame()                              # for this line

Main()

Cependant, n'oubliez pas qu'il existe un moyen plus simple d'obtenir le nom du fichier en cours d'exécution :

 print(__file__)

13voto

Preet Sangha Points 39414

Par exemple

 import inspect
frame = inspect.currentframe()
# __FILE__
fileName  =  frame.f_code.co_filename
# __LINE__
fileNo = frame.f_lineno

Il y a plus ici http://docs.python.org/library/inspect.html

11voto

Matthew Points 71

S'appuyant sur la réponse de geowar :

 class __LINE__(object):
    import sys

    def __repr__(self):
        try:
            raise Exception
        except:
            return str(sys.exc_info()[2].tb_frame.f_back.f_lineno)

__LINE__ = __LINE__()

Si vous souhaitez normalement utiliser __LINE__ dans, par exemple print (ou à tout autre moment où un str() ou repr() implicite est pris), ce qui précède vous permettra d'omettre les () s.

(Extension évidente pour ajouter un __call__ laissé comme exercice au lecteur.)

10voto

Vous pouvez vous référer à ma réponse : https://stackoverflow.com/a/45973480/1591700

 import sys
print sys._getframe().f_lineno

Vous pouvez également faire la fonction lambda

7voto

Hugh Perkins Points 1050

wow, question de 7 ans :)

Quoi qu'il en soit, en prenant la réponse de Tugrul et en l'écrivant sous la forme d'une debug , cela peut ressembler à quelque chose comme :

 def debug(message):
    import sys
    import inspect
    callerframerecord = inspect.stack()[1]
    frame = callerframerecord[0]
    info = inspect.getframeinfo(frame)
    print(info.filename, 'func=%s' % info.function, 'line=%s:' % info.lineno, message)

def somefunc():
    debug('inside some func')

debug('this')
debug('is a')
debug('test message')
somefunc()

Sortir:

 /tmp/test2.py func=<module> line=12: this
/tmp/test2.py func=<module> line=13: is a
/tmp/test2.py func=<module> line=14: test message
/tmp/test2.py func=somefunc line=10: inside some func

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