用Python包装一个C++库,该库调用Python C API

Wrapping a C++ library in Python that calls the Python C API

本文关键字:Python API C++ 调用 一个 包装      更新时间:2023-10-16

C++库使用SWIG封装在Python中。我们可以在Python中实例化一个类,当我们调用该类中使用Python C API的方法时,会出现以下错误:

Python致命错误:PyThreadState_Get:没有当前线程中止陷阱:6

如果我们在C中调用Python之前插入Py_BEGIN_ALLOW_THREADS,那么错误就会变成Segmentation错误。

这似乎是Python调用C的问题,而C调用Python,不是吗?有什么想法吗?

在从C调用python之前,您需要确保使用PyGILState_Ensure()锁定GIL,并且在调用之后,您可以使用PyGILState_Release()释放GIL。更多信息:

https://docs.python.org/2/c-api/init.html?highlight=gil#PyGILState_Ensure