9

当调用在 C 共享库(动态库)中执行的循环时,Python 不会收到 KeyboardInterrupt,并且不会响应(或处理)CTRL+C。

我该怎么办?

4

3 回答 3

4

除非你使用PyDLLor PYFUNCTYPE; GIL 在 ctypes 调用期间被释放。KeyboardInterrupt因此,如果 C 代码没有安装自己的信号处理程序,Python 解释器应该通过在主线程中引发来处理 SIGINT 。

允许 Python 代码在主线程中运行;您可以将 ctypes 调用放入后台线程:

import threading

t = threading.Thread(target=ctypes_call, args=[arg1, arg2, ...])
t.daemon = True
t.start()
while t.is_alive(): # wait for the thread to exit
    t.join(.1)
于 2013-01-11T07:21:59.210 回答
1

您必须在 C 中为 SIGINT 声明一个信号处理程序,希望它是您的项目。

于 2013-01-11T04:30:11.430 回答
1

我使用了线程解决方案,但随后切换到了信号解决方案。我使用的解决方法是从 SIGINT 处理程序发送 SIGTERM,例如:

signal.signal(signal.SIGINT, lambda s, f : os.kill(os.getpid(), signal.SIGTERM))

在这里我只想保存一个解决方案的核心思想,以便下次更快找到它以及我改变方法的原因。线程变体不适合我,因为当不是从主线程调用 OpenMP 时,它的速度会明显变慢。

于 2017-08-08T14:11:54.583 回答