使用 Py_SetPath() 和 Py_GetPath() 后的 Python C API free() 错误

标签 python c python-c-api

我想弄清楚为什么我不能简单地通过它的 C API 获取和设置 python 路径。我在 Ubuntu 17.10 上使用 Python3.6,gcc 版本为 7.2.0。编译:

gcc pytest.c `python3-config --libs` `python3-config --includes`

#include <Python.h>

int main()
{
    Py_Initialize(); // removes error if put after Py_SetPath

    printf("setting path\n"); // prints
    Py_SetPath(L"/usr/lib/python3.6"); // Error in `./a.out': free(): invalid size: 0x00007fd5a8365030 ***
    printf("success\n"); // doesn't print
    return 0;
}

设置路径工作正常,除非我也尝试在这样做之前获取路径。如果我完全获得路径,即使只是打印而不修改返回值或任何其他内容,我也会收到“双重释放或损坏”错误。

很迷茫。我做错了什么还是这是一个错误?如果是这样,有人知道解决方法吗?

编辑:调用 Py_Initialize(); 后也出现错误。更新代码。现在即使我不先调用 Py_GetPath() 也会出错。

最佳答案

从 alk 看来它与这个错误有关:https://bugs.python.org/issue31532

这是我正在使用的解决方法。由于您不能在 Py_Initialize() 之前调用 Py_GetPath(),而且您似乎也不能在 之后调用 Py_SetPath() Py_Initialize(),你可以在调用Py_Initialize()后添加或获取这样的路径:

#include <Python.h>

int main()
{
    Py_Initialize();

    // get handle to python sys.path object
    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");

    // make a list of paths to add to sys.path
    PyObject *newPaths = PyUnicode_Split(PyUnicode_FromWideChar(L"a:b:c", -1), PyUnicode_FromWideChar(L":", 1), -1);

    // iterate through list and add all paths
    for(int i=0; i<PyList_Size(newPaths); i++) {
        PyList_Append(path, PyList_GetItem(newPaths, i));
    }

    // print out sys.path after appends
    PyObject *newlist = PyUnicode_Join(PyUnicode_FromWideChar(L":", -1), path);
    printf("newlist = %ls\n", PyUnicode_AsWideCharString(newlist, NULL));
    return 0;
}

关于使用 Py_SetPath() 和 Py_GetPath() 后的 Python C API free() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198057/

相关文章:

c - 与交换空间相关的链接器性能?

c++ - 如何在 NUMA 机器上的不同节点上分配数组的一部分?

python - 对于 Python C 扩展,使用 Py_DECREF 而不是 Py_XDECREF 有什么好处吗?

python - Pyinstaller 和 Django Rest

Python:什么库是 'standard libraries' ?

python - 如何将二维数组从 C 传递给 Python

python - Python 3 解释器在嵌入时会泄漏内存吗?

python - 使用 Bokeh 或 ArcPy 标记 map

C循环依赖

python - 为什么在通过 Python 的 C API 调用 pyplot.draw() 时重新播种 rand()?