Windows下C++嵌入Python导入paramiko出现_rust DLL加载失败错误
原因分析
- Python 3.8+ Windows版本的DLL搜索机制变更:Python 3.8开始,扩展模块加载DLL时默认不再读取系统PATH环境变量的路径,仅信任Python核心安装目录、通过
os.add_dll_directory显式添加的路径。直接在CMD启动Python解释器时,程序会自动把相关依赖路径加入搜索列表,但嵌入到C++程序时该初始化步骤不会自动执行,导致cryptography的Rust扩展依赖的运行时DLL找不到。 - 架构不匹配:你使用的是32位Python 3.8,如果C++程序用VS编译为64位目标,就无法加载32位Python的扩展模块,即使路径正确也会报DLL加载失败。
- 运行环境依赖缺失:部分版本的cryptography Rust扩展依赖VC可再发行组件,CMD环境有对应组件,但C程序的运行上下文没有加载对应组件。
解决方案
- 确认架构匹配:将C++程序的编译目标设置为32位(x86),和32位Python 3.8架构保持一致,VS编译时在解决方案平台栏选择x86即可。
- 显式添加DLL搜索路径:在导入paramiko之前先执行代码添加依赖路径,示例如下:
PyRun_SimpleString(R"( import os # 替换为你本地的Python DLLs目录路径 os.add_dll_directory(r"C:\Users\chaitanya.raut\AppData\Local\Programs\Python\Python38-32\DLLs") )"); // 再执行导入操作 PyRun_SimpleString("import paramiko");
- 配置进程环境变量:在初始化Python之前,将Python相关路径添加到当前进程的PATH中,示例如下:
SetEnvironmentVariableA("PATH", "C:\\Users\\chaitanya.raut\\AppData\\Local\\Programs\\Python\\Python38-32;C:\\Users\\chaitanya.raut\\AppData\\Local\\Programs\\Python\\Python38-32\\DLLs;%PATH%"); Py_Initialize();
- 安装对应运行时:安装32位版本的VC++ 2015-2022可再发行包,补齐运行时依赖。
- 降级cryptography版本:如果上述方案都无效,可以安装无Rust依赖的旧版本cryptography:
pip install cryptography==3.4.8
内容的提问来源于stack exchange,提问作者Chaitanya Raut
相关产品推荐
相关产品推荐

