CTRL + C不会在Python中使用CTYPES中断对共享库的调用

当调用在C共享库(动态库)中执行的循环时,Python将不会收到KeyboardInterrupt,并且没有任何内容会响应(或处理)CTRL + C.

我该怎么办?

除非你使用PyDLLPYFUNCTYPE ; 在ctypes调用期间释放GIL。 因此,如果C代码没有安装自己的信号处理程序,Python解释器应该通过在主线程中引发KeyboardInterrupt来处理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在不是从主线程调用时变得非常慢。