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

Python C扩展加载失败求助:ImportError无法找到指定模块

Python C扩展高版本加载失败的排查与解决

问题背景

几年前在Windows 10系统下,用Visual C++ 2015、Python 3.9及numpy编写了封装公司C SDK的Python C扩展,测试多款旧版Python 3均能正常运行。近期在Windows 10上用Python 3.11加载该扩展(源码未改动)时,出现错误:
ImportError: DLL load failed while importing PyGage: The specified module could not be found.
该问题已在3台不同电脑、多个Python版本中出现。

已尝试操作:

  • 使用Dependency Walker和dependencies工具检查依赖,均显示无缺失
  • 尝试用Visual C++ 2015和2017重新编译扩展
  • 安装了VC 2015和2017的运行时库
  • 通过setup.py编译安装扩展

异常现象:

  • 部分电脑可正常运行该扩展
  • 无法运行的电脑上,该扩展在Anaconda Python 3.9.7中仍能正常工作
  • 有问题的电脑共同点是近期安装过Visual Studio 2022,卸载后问题依旧

定位缺失模块的具体方法

  • 用Python自带ctypes捕获详细错误:编写简单脚本直接加载扩展DLL,获取更精准的缺失依赖信息:

    import ctypes
    try:
        ctypes.CDLL("PyGage.pyd")
    except Exception as e:
        print(e)
    
  • 用Process Monitor追踪加载过程:

    1. 打开Process Monitor,设置过滤条件:
      • 进程名称为python.exe
      • 操作包含Load Image
      • 结果为NAME NOT FOUND或PATH NOT FOUND
    2. 运行你的Python导入脚本,查看捕获到的缺失DLL记录,可直接定位问题模块。
  • 检查Python DLL搜索路径:Python 3.8+修改了DLL加载策略,默认不再搜索当前目录外的路径。可手动添加路径测试:

    import sys
    import os
    # 添加扩展所在目录
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    # 添加公司SDK的DLL目录
    os.add_dll_directory("path/to/your/sdk/dlls")
    import PyGage
    

针对性解决措施

  • 匹配Python版本的编译工具链:Python 3.10+由VS2019编译,旧版VC2015/2017编译的扩展可能存在ABI兼容问题。尝试用VS2019或VS2022重新编译扩展,编译前可通过vcvarsall.bat配置对应环境。

  • 检查运行时库的位数与版本:确保安装的VC运行时库与编译时版本一致,且位数(32/64位)和Python版本匹配。Anaconda能正常运行的原因是自带了适配的运行时环境。

  • 清理VS2022残留环境变量:卸载VS2022后可能残留LIB、INCLUDE等环境变量,导致加载错误库。打开命令提示符输入set LIB和set INCLUDE查看,删除指向VS2022的路径后重启测试。

  • 打包所有依赖DLL:用dumpbin /dependents PyGage.pyd查看扩展依赖的所有DLL,将非系统自带的DLL与扩展放在同一目录下,或添加到Python的DLL搜索路径中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:17:29