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

Python C API调用Py_SetPath()后出现free()无效大小错误排查求助

解决Python C API中Py_SetPath触发free()无效错误的问题

嘿,我来帮你捋清楚这个问题!你遇到的free(): invalid size崩溃,核心原因非常明确——Py_SetPath必须在Python解释器初始化之前调用,也就是要把它放在Py_Initialize()的前面!

问题根源

Python的C API设计里,Py_SetPath是用来提前配置解释器模块搜索路径的接口,它需要在解释器还没完成任何内部内存分配和初始化工作时执行。一旦你先调用了Py_Initialize(),解释器已经创建了不少内部数据结构,这时候再调用Py_SetPath就会破坏已有的内存布局,触发内存释放时的非法操作,直接导致程序崩溃。

修正后的代码

把调用顺序调换过来,再加上必要的收尾操作,代码就能正常运行了:

#include <Python.h>
int main() {
    printf("setting path\n");
    // 先设置路径,再初始化解释器
    Py_SetPath(L"/usr/lib/python3.6");
    Py_Initialize();
    printf("success\n");
    
    // 清理解释器资源,避免内存泄漏
    Py_Finalize();
    return 0;
}

额外注意事项

  • 你的编译命令gcc pytest.c python3-config --libs python3-config --includes`是完全正确的,不用调整;
  • Py_SetPath的参数需要是宽字符串(带L前缀),在你的Ubuntu环境下这个写法没问题;
  • 记得调用Py_Finalize()来释放Python解释器占用的资源,养成良好的内存管理习惯。

按照这个写法运行,你就能看到success正常打印,也不会再出现内存错误啦!

内容的提问来源于stack exchange,提问作者cowemoji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:34:11