首页 > 解决方案 > C++ - 使用 numpy 嵌入 Python - 部署错误

问题描述

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

对于我的 C++ 应用程序,我使用的是 WinPython python,它安装了 numpy 和一些其他包。在使用 Visual Studio 时,我设法在我的应用程序中嵌入了 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']

然后我在 Release 中使用 Wix 设置了一个安装程序,并检查了 Winpython python37.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,就是这种情况。知道什么可能导致此错误吗?

更新:

按照这个线程中描述的想法,我设法通过创建一个 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 个月)很烦人......

标签: pythonc++numpy

解决方案


推荐阅读