是否可以在从C调用的ctypes回调中引发Python异常?
我有一个使用是否可以在从C调用的ctypes回调中引发Python异常?,python,exception-handling,ctypes,Python,Exception Handling,Ctypes,我有一个使用ctypes包装的共享库。该库公开可用于修改其错误处理行为的函数指针。我不想简单地打印警告或使用退出(1)终止进程,我想提出一个Python异常,它可以在Python端捕获和处理 下面是我试图做的一个草图: import ctypes mylib = ctypes.cdll.LoadLibrary('mylib.so') error_handler_p = ctypes.c_void_p.in_dll(mylib, 'error_handler') @ctypes.CFUNCT
ctypes
包装的共享库。该库公开可用于修改其错误处理行为的函数指针。我不想简单地打印警告或使用退出(1)终止进程,我想提出一个Python异常,它可以在Python端捕获和处理
下面是我试图做的一个草图:
import ctypes
mylib = ctypes.cdll.LoadLibrary('mylib.so')
error_handler_p = ctypes.c_void_p.in_dll(mylib, 'error_handler')
@ctypes.CFUNCTYPE(None, ctypes.c_char_p)
def custom_error_handler(message):
raise RuntimeError(message)
error_handler_p.value = ctypes.cast(custom_error_handler, ctypes.c_void_p).value
try:
mylib.do_something_bad()
except RuntimeError:
# maybe handle the exception here
目前,似乎在回调中引发了异常,因为我在STDERR中看到了带有预期错误消息的回溯。但是,此异常似乎不会传播到调用Python进程,因为该异常从未被捕获,调用进程正常终止。您必须使用(通过ctypes.pydll
加载程序)访问库,而您的C代码必须使用。
通过调用,然后返回-1
来标记函数中的错误,可以在C代码中“引发”异常。然后,PyDLL()
类将检查是否设置了异常
你不能使用任何其他装载机。请注意,PyDLL()
加载程序也不会释放GIL;这将由您的扩展负责(使用)
请注意,由于您已经必须使用Python API来引发异常,因此您最好将C代码作为适当的Python扩展公开。这不是我希望的答案,但感谢您的解释@ali_m:是的,另一种方法是为您的
ctypes
-wrapped库创建Python包装器模块,检查那里的错误条件,并根据需要引发异常。