将新的pyObj*从C++返回到Python,最终导致StutsRebug

2024-04-20 07:45:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个库的C++和python,它将我们的C++软件中的一些功能暴露到Python脚本。我正在将一些感兴趣的源文件和一个如下所示的包装文件编译到一个共享库中,并使用ctypes加载该库。你知道吗

extern "C" {
    PyObject *py_get_cxx_set_EXAMPLE(void)
    {
        std::set<long> cset = get_cxx_set_for_python();
        PyGILState_STATE gstate = PyGILState_Ensure();
        PyObject *pyset = PySet_New(NULL);
        for (long c_long: cset)
            PySet_Add(pyset, PyLong_FromLong(c_long));
        PyGILState_Release(gstate);
        return pyset;
    }
}

在python方面:

example_lib.py_get_cxx_set_EXAMPLE.restype = ctypes.py_object
for i in range(0, 1000):
    ret = example_lib.py_get_cxx_set_EXAMPLE()

我发现前几个调用是成功的,但是C++代码会在循环的中段进行分段。在GDB'ing之后,我会发现调用堆栈的结尾如下:

#0  0x000055555563244a in PyErr_Occurred ()
#1  0x000055555562a387 in _PyObject_GC_Malloc ()
#2  0x0000555555629ebd in _PyObject_GC_New ()
#3  0x000055555562b23c in PyDict_New ()
#4  0x00007ffff66df9be in python::to_python_object<db::pmbus_diagnostics> (t=...) at python_wrapper/python.hpp:101

看起来Python运行时拒绝为我生成更多Python对象(在本例中是dict)。。。!你知道吗

我在C++代码中做了什么错误?你知道吗

编辑: 更新,见答案


Tags: inpynewforgetexamplecxxctypes
1条回答
网友
1楼 · 发布于 2024-04-20 07:45:33

好吧,我忘了添加代码来获取和释放某类函数的全局解释器锁。对不起,这个愚蠢的问题。你知道吗

对Python孩子有信心。你知道吗

相关问题 更多 >