You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:50:23