首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调试import语句更改行为

如何调试import语句更改行为
EN

Stack Overflow用户
提问于 2014-10-18 02:57:28
回答 1查看 74关注 0票数 2

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

就它本身而言,它工作得很好,但一旦我在我的程序中尝试它,它就不能工作。添加或删除导入似乎会更改行为。

在没有P4API导入的情况下,它可以像我预期的那样工作。如果我确实导入了P4API,ctr-c似乎会调用exit或绕过我的处理程序,但我不确定原因,也不知道如何跟踪正在更改的内容。

signal handler source

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2014-10-18 03:42:41

根据the documentation的说法,p4api有一个名为Signaler的类,用于“中断处理”:

API类使

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

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

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

您可以找到详细的here,但看起来Signaler::OnIntr是您想要调用以注册其信号处理程序的函数的C++名称。文档中也有示例代码。第一个谷歌搜索结果是this C++ source,这很清楚地表明这是正确的。

我在Python API docs中看不到任何东西,我不知道Python API是C++ API的包装器,还是一个单独的实现,但无论哪种方式,我猜它有一个同名的类,您必须以相同的方式使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26431643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档