当调用在 C 共享库(动态库)中执行的循环时,Python 不会收到 KeyboardInterrupt,并且不会响应(或处理)CTRL+C。
我该怎么办?
当调用在 C 共享库(动态库)中执行的循环时,Python 不会收到 KeyboardInterrupt,并且不会响应(或处理)CTRL+C。
我该怎么办?
除非你使用PyDLL
or 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)
您必须在 C 中为 SIGINT 声明一个信号处理程序,希望它是您的项目。
我使用了线程解决方案,但随后切换到了信号解决方案。我使用的解决方法是从 SIGINT 处理程序发送 SIGTERM,例如:
signal.signal(signal.SIGINT, lambda s, f : os.kill(os.getpid(), signal.SIGTERM))
在这里我只想保存一个解决方案的核心思想,以便下次更快找到它以及我改变方法的原因。线程变体不适合我,因为当不是从主线程调用 OpenMP 时,它的速度会明显变慢。