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

使用MSYS2编译的嵌入式Python C程序在Windows原生环境找不到libpython3.dll

解决MSYS2编译的Python嵌入C程序在Windows原生环境找不到libpython3.dll的问题

问题原因

MSYS2 Shell会自动配置其自带库的搜索路径,但Windows原生CMD/PowerShell没有这个默认配置,导致程序无法定位libpython3.dll。以下是几种通过环境设置或代码调整解决的方案:


方案1:临时设置原生Shell的PATH环境变量

运行程序前,手动把MSYS2的Python DLL所在目录添加到系统PATH中:

  • CMD环境:
    set PATH=C:\msys64\mingw32\bin;%PATH%
    
  • PowerShell环境:
    $env:PATH = "C:\msys64\mingw32\bin;" + $env:PATH
    

执行完上述命令后,直接运行你的可执行程序即可。

方案2:永久添加PATH系统环境变量

如果需要长期支持原生环境运行,可将DLL目录加入系统PATH:

  1. 右键「此电脑」→「属性」→「高级系统设置」→「环境变量」
  2. 在「系统变量」区域找到PATH,点击「编辑」
  3. 添加新路径:C:\msys64\mingw32\bin
  4. 依次点击「确定」保存设置,重启Shell或电脑后生效。

方案3:修正代码中的DLL路径配置

检查并修复代码中的变量名错误和逻辑顺序问题:

  1. 变量名拼写修正:你定义了dllDirectory=c:/msys64/mingw32/bin,但调用AddDllDirectory(msys2Path);,这里msys2Path未定义,应改为AddDllDirectory(dllDirectory);;同理pythonEnv应对应pythonpath_env变量。
  2. 调整Python初始化顺序:PyConfig_Read应在Py_InitializeFromConfig之前执行,确保配置先被读取再初始化Python:
    // 初始化配置
    PyConfig_InitPythonConfig(&config);
    
    // 设置home路径
    status = PyConfig_SetString(&config, &config.home, msys2);
    if (PyStatus_Exception(status)) {
        printf("Fail set HOME\n");
        goto exception;
    }
    
    // 设置platlibdir
    status = PyConfig_SetString(&config, &config.platlibdir, platlibdir);
    if (PyStatus_Exception(status)) {
        printf("Fail set platlibdir\n");
        goto exception;
    }
    
    // 设置pythonpath_env
    status = PyConfig_SetString(&config, &config.pythonpath_env, pythonpath_env);
    if (PyStatus_Exception(status)) {
        printf("Fail set pythonpath_env\n");
        goto exception;
    }
    
    // 先读取配置
    status = PyConfig_Read(&config);
    if (PyStatus_Exception(status)) {
        goto exception;
    }
    
    // 再初始化Python
    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) {
        goto exception;
    }
    
  3. 验证AddDllDirectory调用:可添加错误检查确保路径被正确添加:
    HANDLE dllDirHandle = AddDllDirectory(dllDirectory);
    if (!dllDirHandle) {
        printf("AddDllDirectory failed, error code: %d\n", GetLastError());
        goto exception;
    }
    

方案4:编译时使用静态链接(彻底避免DLL依赖)

如果允许静态编译,可修改编译命令使用静态版Python库,生成的程序无需依赖外部DLL:

gcc test.c -IC:/msys64/mingw32/include/python3.11 -I. -LC:/msys64/mingw32/lib -lpython3.11-static -llibffi -D__TEST__

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:14:55