首页 > 解决方案 > 使用 Py_SetPath() 和 Py_GetPath() 后的 Python C API free() 错误

问题描述

我试图弄清楚为什么我不能简单地通过它的 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() 现在也会出错。

标签: pythoncpython-c-api

解决方案


[下面的答案是指这个版本的问题。]

文档

void Py_Initialize()

初始化 Python 解释器。在嵌入 Python 的应用程序中,应该在使用任何其他 Python/C API 函数之前调用它;除了Py_SetProgramName(),Py_SetPythonHome()Py_SetPath()

但是您显示的代码在调用Py_GetPath()之前确实调用了Py_Initialize();,根据上面的段落,它不应该隐式调用。


推荐阅读