如何检查正在执行的Python脚本的哪一行?

7
我有一个Python脚本在Linux服务器上运行了几个小时,为我进行一些数字计算。我想检查它的进度,因此我想看看正在执行哪一行。如果是C或C ++程序,则可以使用>附加到进程并使用检查堆栈跟踪。当然,我可以对Python解释器进程执行相同的操作,但我无法在堆栈跟踪中看到Python脚本的行。那么,如何找出当前执行的Python脚本的哪一行?

1
刚发现这个帖子,并决定将其链接保存在评论中,因为它似乎很相关:'Pyringe:能够附加到Python进程并注入代码的调试器' https://news.ycombinator.com/item?id=7496261 - piokuc
1个回答

9
您可以在Python脚本中添加一个信号处理程序,将信息发送到终端或文件中,然后在终端中按下^C发送信号给进程。
import signal

def print_linenum(signum, frame):
    print "Currently at line", frame.f_lineno

signal.signal(signal.SIGINT, print_linenum)

您还可以使用其他信号,并使用kill命令发送信号,如果您需要^C能够中断脚本,或者设置signal.alarm()以定期打印信息,例如每秒一次。
如果您愿意,您可以从堆栈帧中打印出其他内容;有很多东西在那里。请参见frame对象的属性在此表中

谢谢,这很好。如果正在运行的脚本还没有这个信号处理程序,有什么想法吗? - piokuc
我想你可以使用 gdb 来查找当前的堆栈帧并挖出它的 f_lineno,但这似乎比它值得的麻烦多了... - kindall
非常感谢。我会稍等一下,看看是否有人有不需要信号处理程序的想法,如果没有,我会接受你的答案。 - piokuc
我希望 Python 中有类似 Bash 的 "set -x" 功能。 - DimiDak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接