如何确定文件,函数和行号?

在C ++中,我可以像这样打印debugging输出:

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

我如何在Python中做类似的事情?

有一个名为inspect的模块提供这些信息。

用法示例:

 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() 

但是,请记住,有一个更简单的方法来获取当前正在执行的文件的名称:

 print __file__ 

例如

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

这里有更多http://docs.python.org/library/inspect.html

build立在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__() 

如果你通常想在例如print (或其他任何时候使用隐式str()repr()使用__LINE__ ,上面的代码就可以省略() s。

(明显的扩展是将__call__作为练习添加到读者中。)

 import inspect . . . def __LINE__(): try: raise Exception except: return sys.exc_info()[2].tb_frame.f_back.f_lineno def __FILE__(): return inspect.currentframe().f_code.co_filename . . . print "file: '%s', line: %d" % (__FILE__(), __LINE__()) 

我也对Python中的__LINE__命令感兴趣。 我的出发点是https://stackoverflow.com/a/6811020 ,我用一个元类对象扩展它。 通过这个修改,它具有和C ++一样的行为。

 import inspect class Meta(type): def __repr__(self): # Inspiration: https://stackoverflow.com/a/6811020 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 return str(info.lineno) class __LINE__(metaclass=Meta): pass print(__LINE__) # print for example 18 

你可以参考我的回答: https : //stackoverflow.com/a/45973480/1591700

 import sys print sys._getframe().f_lineno 

你也可以使lambda函数