10

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?

0

3 Answers 3

4

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)
Sign up to request clarification or add additional context in comments.

1 Comment

The GIL! Of course. Thanks, JF. That's worth giving you the answer instead of taking it for myself.
1

You will have to declare a signal handler for SIGINT, within the C, which is, hopefully, your project.

1 Comment

My experience with SIGINT in shared objects is that a handler is needed. It is not enough to block signals and have a thread waiting using sigwait.
1

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

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.