Python转Cython生成DLL后在C++调用时遇torch模块找不到错误
解决C++调用Cython封装PyTorch模块时的ModuleNotFoundError问题
嘿,我碰到过类似的坑,你这个ModuleNotFoundError: No module named 'torch'本质是因为C++进程没正确关联到你装了PyTorch的Anaconda环境,下面给你一步步捋清楚解决办法:
问题根源
当你从C++调用Python/Cython模块时,系统默认会用全局的Python环境,而非你安装PyTorch的Anaconda环境;再加上Python初始化时没把Anaconda的包路径纳入搜索范围,自然就找不到torch模块了。
具体解决步骤
1. 让Visual Studio绑定Anaconda的Python环境
- 打开你的C项目属性,找到**VC目录**:
- 把Anaconda的
include目录(比如C:\Anaconda3\include)加到包含目录的最顶端 - 把Anaconda的
libs目录(比如C:\Anaconda3\libs)加到库目录的最顶端
- 把Anaconda的
- 接着在调试->环境里,给
PATH添加Anaconda的优先级路径:
这样每次运行程序时,系统会优先调用Anaconda的Python相关文件。PATH=C:\Anaconda3;C:\Anaconda3\Scripts;C:\Anaconda3\Library\bin;%PATH%
2. 在C++代码里手动注入PyTorch的包路径
在Py_Initialize()之后,把Anaconda的site-packages目录强行加到Python的sys.path里,确保Python能定位到torch模块。修改你的CppTest.cpp:
#include "stdafx.h" #include "Python.h" #include "C_Test.h" #include <string> int main() { Py_Initialize(); // 手动添加Anaconda的site-packages路径到Python搜索范围 PyObject* sys_path = PySys_GetObject((char*)"path"); std::string site_packages = "C:\\Anaconda3\\Lib\\site-packages"; PyList_Append(sys_path, PyUnicode_FromString(site_packages.c_str())); testdll(); getchar(); Py_Finalize(); // 别忘了清理Python环境 return 0; }
3. 用Anaconda环境编译Cython模块
别用系统默认的命令提示符跑编译命令,打开Anaconda Prompt,切换到你的项目目录再执行:
python setup.py build_ext --inplace
这样生成的Cython模块才会和Anaconda环境绑定,不会出现环境不匹配的问题。
验证修改
重新编译你的C_Test.dll和C++项目,运行后应该能正常输出:
Py_Initialize Done! Hello! 0.4.0 World!
内容的提问来源于stack exchange,提问作者Kia Lin
相关产品推荐
相关产品推荐

