如何在不退出程序的情况下在linux上打印最近的最后一次调用

时间:2013-04-30 21:43:32

标签: python linux call

当我在linux上执行python脚本并中断该过程时,它给了我“最近的最后一次调用”:

Traceback (most recent call last):
  File "clustermptest.py", line 38, in <module>
    if sequences[i][x:x+3]==CAI[cailength][1]:
KeyboardInterrupt

有没有办法查看最近的最后一次调用是什么,即当脚本仍在运行/没有停止脚本时当前正在处理的行?

1 个答案:

答案 0 :(得分:0)

您可以winpdb使用attach to your running program,并允许您在不同的点上进行分解,检查和恢复。


或者,你可以定义一个信号处理程序,虽然这可能不是一个完全可靠的解决方案,特别是如果你使用线程:

import signal
import traceback

def sigint_handler(signal, frame):
    # ctrl-c generates SIGINT
    traceback.print_stack()
    print('-'*80)

def foo():
    total = 0
    for i in range(10**8):
        total += i
    return total

if __name__=='__main__':
    signal.signal(signal.SIGINT, sigint_handler)
    print(foo())

运行test.py,并在不同时刻按C-c会产生:

  C-c C-c  File "/home/unutbu/pybin/test.py", line 20, in <module>
    print(foo())
  File "/home/unutbu/pybin/test.py", line 14, in foo
    for i in range(10**8):
  File "/home/unutbu/pybin/test.py", line 9, in sigint_handler
    traceback.print_stack()
--------------------------------------------------------------------------------
  C-c C-c  File "/home/unutbu/pybin/test.py", line 20, in <module>
    print(foo())
  File "/home/unutbu/pybin/test.py", line 15, in foo
    total += i
  File "/home/unutbu/pybin/test.py", line 9, in sigint_handler
    traceback.print_stack()
--------------------------------------------------------------------------------
4999999950000000

参考文献:

  1. The signal module(务必阅读警告)
  2. The traceback module
  3. Doug Hellman's Python Module of the Week tutorial on using signal