如何调试导入语句更改行为

时间:2014-10-17 18:57:28

标签: python windows perforce

我有一个脚本,我试图为ctr-c添加一个信号处理程序,在退出之前做一些最后的处理。

就它本身而言,它运行正常,但一旦我在我的程序中尝试它,它就不起作用。添加或删除导入似乎会改变行为。

没有P4API导入,它可以正常工作。如果我导入P4API,ctr-c似乎调用exit或绕过我的处理程序,我不知道为什么,或者如何跟踪正在改变的内容。

signal handler source

import signal
import time
import sys

# -- with this commented out, things work 
#import P4API

def run_program():
    while True:
        time.sleep(1)
        print("a")

def exit_gracefully(signum, frame):
    # restore the original signal handler as otherwise evil things will happen
    # in raw_input when CTRL+C is pressed, and our signal handler is not re-entrant
    signal.signal(signal.SIGINT, original_sigint)

    try:
        if raw_input("\nReally quit? (y/n)> ").lower().startswith('y'):
            sys.exit(1)

    except KeyboardInterrupt:
        print("Ok ok, quitting")
        sys.exit(1)

    # restore the exit gracefully handler here
    signal.signal(signal.SIGINT, exit_gracefully)

if __name__ == '__main__':
    # store the original SIGINT handler
    original_sigint = signal.getsignal(signal.SIGINT)
    signal.signal(signal.SIGINT, exit_gracefully)
    run_program()

1 个答案:

答案 0 :(得分:1)

根据the documentation,p4api有一个名为Signaler的类,它用于"中断处理":

  

Signaler类使API程序员能够注册在客户端应用程序收到中断信号时要调用的函数。 Signaler类维护已注册函数的列表,并依次调用每个函数。

     

默认情况下,在执行完所有已注册的函数后,进程退出,返回-1到操作系统。

据推测,当你import p4api时会安装它。因此,您的信号处理程序正在干扰其信号处理程序,最终它会在您有机会做任何有用的事情之前窃取信号并调用_exit(-1)或类似信号。

您可以找到详细信息here,但看起来Signaler::OnIntr是您要调用以向其信号处理程序注册的函数的C ++名称。文档中也有示例代码。第一个Google搜索结果为我提供了this C++ source,这非常清楚,这是正确的。

我在Python API docs中看不到任何内容,我也不知道Python API是否是C ++ API的包装器,或者是单独的实现,但无论如何我都是&#39 ;我猜它有一个类似名称的类,你必须以同样的方式使用。