程序执行时如何打印文件路径和行号?

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 时获取行号和文件名非常容易(您甚至可以通过对源代码进行细微的更改来实现这一点)。但printsys.stdout.write 调用并非如此。 @Jalaj 我只想用logging 来做,而不是print。但不知道添加什么以及在哪里添加。 【参考方案1】:

您只需要设置一个由linenopathname 组成的日志格式。考虑这个名为 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 的两个内部模块(linecachesys):

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

【讨论】:

以上是关于程序执行时如何打印文件路径和行号?的主要内容,如果未能解决你的问题,请参考以下文章

LABVIEW程序打包生成exe执行文件时,参数路径变了

linux怎么打印文件的路径和文件的内容

Linux下获取可执行程序的绝对路径

如何通过 Shell (BASH/ZSH/SH) 获取文件的绝对路径?

在给定行号的文本文件中打印行

无论如何在产生进程时指定 PrintTo 打印机?