当调用在C共享库(动态库)中执行的循环时,Python将不会收到KeyboardInterrupt,并且没有任何内容会响应(或处理)CTRL + C.
我该怎么办?
答案 0 :(得分:3)
除非您使用PyDLL
或PYFUNCTYPE
;在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)
答案 1 :(得分:1)
你必须在C中声明SIGINT的信号处理程序,希望这是你的项目。
答案 2 :(得分:1)
我使用线程解决方案,但后来切换到信号解决方案。 我使用的解决方法是从SIGINT处理程序发送SIGTERM,例如:
<div class="progress-wrapper">
<div class="progress-name">html & php</div>
<div class="progress-percen">97%</div>
<div class="progress-back" data-percent="97%">
<div>
<div class="progress-full-line-over animated slideInLeft"></div>
</div>
</div>
</div>
<div class="progress-wrapper">
<div class="progress-name">wordpress</div>
<div class="progress-percen">80%</div>
<div class="progress-back" data-percent="80%">
<div>
<div class="progress-full-line-over animated slideInLeft"></div>
</div>
</div>
</div>
在这里,我只想保存解决方案的核心思想,以便下次更快地找到它,以及我改变方法的原因。线程变体不适合我,因为OpenMP在不是从主线程调用时变得非常慢。