當調用在C共享庫(動態庫)中執行的循環時,Python不會收到KeyboardInterrupt,也不會響應(或處理)CTRL + C。CTRL + C不會中斷使用Python中的CTYPES調用共享庫
我該怎麼辦?
當調用在C共享庫(動態庫)中執行的循環時,Python不會收到KeyboardInterrupt,也不會響應(或處理)CTRL + C。CTRL + C不會中斷使用Python中的CTYPES調用共享庫
我該怎麼辦?
除非您使用PyDLL
或PYFUNCTYPE
; GIL在ctypes調用期間被釋放。因此,如果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的經驗是需要一個處理程序。阻塞信號並使用sigwait等待線程是不夠的。 –
我使用了一個線程解決方案,但後來切換到一個信號。 工作,圍繞我用的是從SIGINT處理程序發送SIGTERM,如:
signal.signal(signal.SIGINT, lambda s, f : os.kill(os.getpid(), signal.SIGTERM))
在這裏,我只是想保存解決方案的核心思想更快地找到它下一個時間和原因,我已經改變了做法。線程變體對我來說並不適合,因爲不是從主線程調用OpenMP時,OpenMP會變得非常慢。
GIL!當然。謝謝,JF。這值得給你答案,而不是爲自己服用。 –