簡體   English   中英

CTRL + C不會在Python中使用CTYPES中斷對共享庫的調用

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

當調用在C共享庫(動態庫)中執行的循環時,Python將不會收到KeyboardInterrupt,並且沒有任何內容會響應(或處理)CTRL + C.

我該怎么辦?

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

您必須在C中聲明SIGINT的信號處理程序,希望這是您的項目。

我使用了線程解決方案,但后來切換到信號解決方案。 我使用的解決方法是從SIGINT處理程序發送SIGTERM,例如:

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

在這里,我只想保存解決方案的核心思想,以便下次更快地找到它,以及我改變方法的原因。 線程變體不適合我,因為OpenMP在不是從主線程調用時變得非常慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM