程序执行时如何打印文件路径和行号?
Posted
技术标签:
【中文标题】程序执行时如何打印文件路径和行号?【英文标题】:How to print file path and line number while program execution? 【发布时间】:2021-01-16 07:04:59 【问题描述】:我正在运行 Python 程序,但出现错误。程序是别人写的。
程序有很多类、方法、循环等,
假设我得到一个错误,Python中的错误报告包含行号和嵌套调用信息,并以键错误结束。
我想要这样的东西:
当程序执行时,我可以在终端中看到的输出应该包含文件名(或文件的路径)和它正在执行的行号并且错误报告应该是平常。
示例(输出):
file1 line1:正常输出(如果有的话)
file1 line2:正常输出(如果有的话)
file2 line1:正常输出(如果有的话)
file2 line2:正常输出(如果有的话)
file1 line9:正常输出(如果有的话)
file1 line10:正常输出(如果有)
..................................................
【问题讨论】:
您是通过print()
调用提供输出还是使用logging
模块?因为在使用logging
时获取行号和文件名非常容易(您甚至可以通过对源代码进行细微的更改来实现这一点)。但print
或sys.stdout.write
调用并非如此。
@Jalaj 我只想用logging
来做,而不是print
。但不知道添加什么以及在哪里添加。
【参考方案1】:
您只需要设置一个由lineno
和pathname
组成的日志格式。考虑这个名为 test.py
的文件:
import logging
logging.basicConfig(
format="%(pathname)s line%(lineno)s: %(message)s",
level=logging.INFO
)
logging.info("test message")
当你运行这个程序时,
$ python3 test.py
test.py line6: test message
只需将上面的 sn-p 粘贴到您的任何文件中即可。确保在对任何logging
调用的任何调用之前执行它。
这里列出了您可以在日志记录格式中使用的所有参数:logging.LogRecord
【讨论】:
【参考方案2】:使用 Python 的两个内部模块(linecache
、sys
):
import linecache
import sys
def PrintException():
exc_type, exc_obj, exc_info = sys.exc_info()
f = exc_info.tb_frame
lineno = exc_info.tb_lineno
filename = f.f_code.co_filename
linecache.checkcache(filename)
line = linecache.getline(filename, lineno, f.f_globals)
print (', "" (Error: )'.format(filename, lineno, line.strip(), exc_obj))
try:
print (1/0) # place here code which you need check
except:
PrintException()
【讨论】:
以上是关于程序执行时如何打印文件路径和行号?的主要内容,如果未能解决你的问题,请参考以下文章