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

时间:2013-01-11 04:30:11

标签: python c signals shared-libraries ctypes

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

我该怎么办?

3 个答案:

答案 0 :(得分:3)

除非您使用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)

答案 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在不是从主线程调用时变得非常慢。