我已将 Python 嵌入到 Windows 上的 C 应用程序中。为了分发,我将整个 python 文件夹放在我的 exe 旁边:
\Installation Dir
app.exe
script.py
\python
作为测试,我使我的 C 应用程序非常简单。它设置解释器并尝试运行 script.py
。
C 源代码的全部内容如下:
#include <Python.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
Py_OptimizeFlag=1;
Py_SetPythonHome("python");
Py_SetProgramName(argv[0]);
Py_Initialize();
PySys_SetPath("python/Lib;python/DLLs;python/Lib/site-packages;");
PySys_SetArgv(argc, argv);
PyObject* PyFileObject = PyFile_FromString("script.py", "r");
PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), "script.py", 1);
Py_Finalize();
}
这似乎运作良好……有时。
在某些机器上,我收到 ImportError: DLL load failed
错误,通常指的是 _socket
。
我已明确设置指向 Lib
和 DLLs
文件夹的路径,所以我不明白为什么会出现此错误?
它一定是与现有版本的 Python 有某种冲突,但我已经成功地在其他已经安装了多个 python 版本的 PC 上安装并运行它?
是否需要设置一些其他变量或注册表设置以确保嵌入式 python 可以找到它需要的内容?
理想情况下,我会避免设置注册表值,因为我希望此安装是“自包含的”,并且不会潜在地破坏用户可能安装的任何其他 python 版本。
有什么想法吗?
最佳答案
通过在我的 python 文件夹中搜索关键字:“_socket”,我发现了一些有趣的东西。 “python/libs”文件夹中有“_socket.lib”,“python/DLLs”文件夹中有“_socket.pyd”。我不知道关于这个特定库的任何详细信息,但我想您可以通过将“python/libs”添加到您设置 PySys_SetPath 的字符串 来简单地解决您的问题。或者您可以尝试通过在您自己一切正常的环境中引用 sys.path 来包含更多文件夹。
这种猜测背后的原因是,我听说在进行 C/C++ 编程时,.pyd 文件基本上与 .dll 文件起着相同的作用。编译动态链接库时,会同时生成 .h、.dll 和 .lib 文件。 .dll 包含主要代码,.lib 包含 dll 导出的内容。
关于python - 在 C 中嵌入 python - 分发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27187319/