Python C扩展加载失败求助:ImportError无法找到指定模块
问题背景
几年前在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追踪加载过程:
- 打开Process Monitor,设置过滤条件:
- 进程名称为
python.exe - 操作包含
Load Image - 结果为
NAME NOT FOUND或PATH NOT FOUND
- 进程名称为
- 运行你的Python导入脚本,查看捕获到的缺失DLL记录,可直接定位问题模块。
- 打开Process Monitor,设置过滤条件:
检查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

