PyDict_New()和python上的分段错误>= 3.10

5cnsuln7  于 2023-02-26  发布在  Python
关注(0)|答案(1)|浏览(101)

我的python/c库有一个奇怪的问题。在python〉= 3.7和〈python 3.10的情况下一切都很好。在python〉= 3.10的情况下,运行gdb的python脚本segfaults.显示PyObject上有segfaults * ret = PyDict_New();
我搜索了python3.10和3.11的发行说明,但是没有找到任何相关的东西(我搜索的是删除的函数,改变的行为等)。
密码为:

extern "C" PyObject* compute(const char* path, int b, int h, int f, int z, int m, int mf, char* output) {
    PyObject* ret = PyDict_New();
    // some code
    return ret;
}

如果我完全删除代码,只让PyDict_New()
有什么想法吗?我有一种直觉,我错过了一些愚蠢的东西,但找不到什么。谢谢

n9vozmp4

n9vozmp41#

您可能使用了CDLLWinDLL而不是PyDLL来加载库。(全局解释器锁)。我能够用CDLL和Python 3. 9加载,但不能用3. 10或3. 11加载,所以重现了您的问题,但是在没有GIL的情况下调用PythonAPI是未定义的行为。所有三个Python版本都可以像预期的那样使用PyDLL
test.cpp

#include <Python.h>

extern "C" __declspec(dllexport)
PyObject* compute() {
    PyObject* ret = PyDict_New();
    return ret;
}

test.py

import ctypes as ct

lib = ct.PyDLL('./test')
lib.compute.argtypes = ()
lib.compute.restype = ct.py_object
print(lib.compute())

输出:

{}

相关问题