python - 在 C 中嵌入 python - 分发

标签 python c embed importerror

我已将 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

我已明确设置指向 LibDLLs 文件夹的路径,所以我不明白为什么会出现此错误?

它一定是与现有版本的 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/

相关文章:

c - 使用 C 对函数和结构进行编程,得到奇怪的输出,没有错误

c - 尝试在 C 中创建链表。但只创建了一半请求的节点

Python 到 SQLite3

python - 我可以进入 Python 库代码吗?

c - listen() 忽略积压参数?

php - preg_replace删除Youtube和Vimeo对象并嵌入链接

xhtml - 如何链接没有字幕的 YouTube 视频?

web - 嵌入式YouTube视频可以在某些计算机上自动播放,而不能在其他计算机上自动播放

python - 左连接并仅获取与 pandas 中第一个字符串匹配的特定列

python - 在列表列表中的两个列表之间查找公共(public)元素的最快方法