是否可以在从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包装器模块,检查那里的错误条件,并根据需要引发异常。