使用Python C API调用C函数时触发访问违例错误求助
解决Python C API中PyObject_RichCompare触发的访问违例错误
你遇到的OSError: exception: access violation writing 0x0000000000000020错误,核心原因是调用Python C API时未持有GIL(全局解释器锁)。用ctypes加载DLL调用C函数时,默认不会自动获取GIL,而PyObject_RichCompare这类Python API函数必须在持有GIL的环境下才能安全执行,这就是Linux和Windows环境都会触发相同错误的原因。
修复方案:手动管理GIL
修改你的C代码,在调用Python API前后手动获取和释放GIL,同时正确管理引用计数:
#include "Python.h" extern "C" { __declspec(dllexport) long test(PyObject* list) { // 获取GIL,保存当前线程状态 PyGILState_STATE gstate = PyGILState_Ensure(); PyObject* first = PyList_GetItem(list, 0); PyObject* second = PyList_GetItem(list, 1); PyObject* result = PyObject_RichCompare(first, second, Py_LT); // 释放RichCompare返回的新引用,避免内存泄漏 if (result != NULL) { Py_DECREF(result); } long sum = PyLong_AsLong(first) + PyLong_AsLong(second); // 释放GIL,恢复线程状态 PyGILState_Release(gstate); return sum; } }
核心说明:
PyGILState_Ensure():进入C函数后立即调用,确保后续所有Python API操作都在持有GIL的环境下进行,这是解决访问违例的关键PyGILState_Release(gstate):函数返回前必须调用,释放GIL以避免阻塞Python主线程或其他线程的执行Py_DECREF(result):PyObject_RichCompare会返回一个新的PyObject引用,如果不手动释放,会造成内存泄漏
重新编译DLL后运行原Python代码,错误即可消除。
内容的提问来源于stack exchange,提问作者Massa7ca
相关产品推荐
相关产品推荐

