2013-07-03 66 views
2

我有一个在Linux服务器上运行数小时的Python脚本,为我处理一些数字。我想检查它的进度,所以我想看看现在正在执行哪条线。如果这是一个C或C++程序,那么我只需附加到gdb -p <pid>的过程,并用where检查堆栈跟踪。当然,我可以在Python解释器进程中做同样的事情,但是我无法在堆栈跟踪中看到Python脚本的行。如何检查Python脚本的哪一行正在执行?

那么,我怎样才能找出当前正在执行的Python脚本的哪一行呢?

+0

刚刚发现了这个主题,并决定在评论中保存一个链接,因为它看起来相关:'Pyringe:能够连接并注入Python进程的调试器'https://news.ycombinator.com/item? id = 7496261 – piokuc

回答

3

您可以将信号处理程序添加到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对象in this table的属性。

+0

谢谢,这很好。任何想法如果正在运行的脚本没有这个信号处理程序,该怎么办? – piokuc

+0

我想你可以用'gdb'找到当前的堆栈框架并挖掘出它的'f_lineno',但它看起来比它的价值更多的麻烦... – kindall

+0

非常感谢。我会稍微等一下,看看有人知道如果没有信号处理程序该怎么办,如果没有,我会接受你的答案。 – piokuc