部署时使用NUMPY错误的C++ Python嵌入

2024-06-15 06:47:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python在C++应用程序中嵌入Python。我正在使用Windows 10和Visual Studio 2015。 目前我已经安装了Anaconda和WinPython(因为我使用的Python脚本只能与其中一个一起工作)。我没有任何与python相关的环境变量

我的C++应用程序,我使用的是WyPython Python,它有NUMPY和其他几个包。在使用VisualStudio进行调试和发布时,我成功地将python和numpy嵌入到我的应用程序中。一切正常,python已经初始化,我可以使用numpy数组和函数。WinPython的使用是正确的。作为我代码中的一个简单测试,我有:

_putenv_s("PYTHONPATH", ".");
Py_InitializeEx(0);
PyRun_SimpleString("import sys");
PyRun_SimpleString("print(sys.path)");
PyRun_SimpleString("print(sys.prefix)");
PyRun_SimpleString("print(sys.executable)");
PyRun_SimpleString("import importlib.machinery");
PyRun_SimpleString("print(importlib.machinery.all_suffixes())");
init_numpy2();

上面印着:

['C:\\DevC++\\Tesseler-Cmake\\build', 'C:\\Git\\WPy64-3741\\python-3.7.4.amd64\\python37.zip', 'C:\\Git\\WPy64-3741\\python-3.7.4.amd64\\DLLs', 'C:\\Git\\WPy64-3741\\python-3.7.4.amd64\\lib', 'C:\\DevC++\\Tesseler-Cmake\\build\\Release', 'C:\\Git\\WPy64-3741\\python-3.7.4.amd64', 'C:\\Git\\WPy64-3741\\python-3.7.4.amd64\\lib\\site-packages', 'C:\\Git\\WPy64-3741\\python-3.7.4.amd64\\lib\\site-packages\\win32', 'C:\\Git\\WPy64-3741\\python-3.7.4.amd64\\lib\\site-packages\\win32\\lib', 'C:\\Git\\WPy64-3741\\python-3.7.4.amd64\\lib\\site-packages\\Pythonwin']
C:\Git\WPy64-3741\python-3.7.4.amd64
C:\DevC++\Tesseler-Cmake\build\Release\Tesseler.exe
['.py', '.pyw', '.pyc', '.cp37-win_amd64.pyd', '.pyd']

然后,我在发行版中使用Wix设置了一个安装程序,并检查了我的应用程序是否附带了winpython37.dll。但当我运行程序时,调用import_numpy2()时会出现以下错误:

['C:\\Tesseler', 'C:\\Tesseler\\python37.zip', 'C:\\Users\\Florian\\anaconda3\\Lib', 'C:\\Users\\Florian\\anaconda3\\DLLs', 'C:\\Users\\Florian\\anaconda3', 'C:\\Users\\Florian\\anaconda3\\lib\\site-packages', 'C:\\Users\\Florian\\anaconda3\\lib\\site-packages\\win32', 'C:\\Users\\Florian\\anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Users\\Florian\\anaconda3\\lib\\site-packages\\Pythonwin']
C:\Users\Florian\anaconda3
C:\Tesseler\Tesseler.exe
['.py', '.pyw', '.pyc', '.cp37-win_amd64.pyd', '.pyd']
ModuleNotFoundError: No module named 'numpy'

我不明白为什么要将anaconda添加到sys.path和sys.prefix中,因为我在visual studio项目中从未引用过它,也没有任何环境变量引用过它。 我明白为什么使用anaconda的dll会导致一些问题,但我向Process Explorer检查了我的应用程序是否使用了它附带的python37.dll,就是这样。 知道是什么导致了这个错误吗

更新:

按照本thread中描述的想法,我通过创建一个python子文件夹并复制其中的整个numpy、scipy、pandas和statsmodels文件夹(我的脚本需要这4个模块),成功地实现了这一功能。这些文件夹是从C:\Git\WPy64-3741\python-3.7.4.amd64\Lib\site-packages复制的。我还将这个python子文件夹添加到PYTHONPATH:_putenv_s("PYTHONPATH", ".;./python");

无论如何,如果有人有更好的解决方案,我很想听听,因为当我的应用程序大约20个月时,我发现捆绑这些模块(超过600个月)很烦人


Tags: gitnumpy应用程序libpackagessyssitepyrun