简体   繁体   中英

CTRL+C doesn't interrupt call to shared-library using CTYPES in Python

When calling a loop being performed in a C shared-library (dynamic library), Python will not receive a KeyboardInterrupt, and nothing will respond (or handle) CTRL+C.

What do I do?

Unless you use PyDLL or PYFUNCTYPE ; the GIL is released during the ctypes calls. Therefore the Python interpreter should handle SIGINT by raising KeyboardInterrupt in the main thread if the C code doesn't install its own signal handler.

To allow the Python code to run in the main thread; you could put the ctypes call into a background thread:

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的信号处理程序,希望这是您的项目。

I used a threaded solution but then switched to a signal one. The work-around I use is to send SIGTERM from SIGINT handler, eg:

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

Here I just want to save a core idea of the solution to find it faster next time and the reason why I have changed the approach. The threaded variant does not suite for me because OpenMP becomes significantly slower when it is called not from the main thread.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM