7

我正在尝试嵌入 python,并提供 python 库的 dll 和 zip,而不使用任何已安装的 python。也就是说,如果用户没有 python,我希望我的代码使用提供的 dll/zip 工作。

这篇文章似乎描述了这个过程,但它对我不起作用。

如果我运行以下命令,只要我有 Python27.dll 和包含 DLL 和 Lib 文件夹的名为 Python27 的文件夹,我的代码就会运行。

Py_SetProgramName(argv[0]);  /* optional but recommended */
Py_SetPythonHome("Python27");
Py_Initialize();

如果我删除 Python27 文件夹,代码将失败 - 所以我将拉入本地副本,而不是任何已安装的 python。

但是,如果我压缩本地 Python27 文件夹,代码将停止运行,并给出“ImportError: No module named site”。

PEP273听起来应该可以正常工作,但是我尝试过的一切都失败了。

谁能阐明如何让嵌入式 python 从 zip 文件运行?

鉴于有一些相关的问题没有得到解答,我认为如果人们已经成功地从 zip 文件中读取内容,即使他们不确定我可能需要修复什么,如果他们添加评论也会很有帮助。

这至少可以帮助我理解我是否应该继续寻找答案!

更新:无论我尝试什么(即使按照建议使用 LoadLibrary),我都可以从完全解压缩的目录中运行我的程序。每当我使用 DLLs/* 和 Lib/* 删除目录并放入 Python27.zip 时,我都会得到

ImportError: No module named site
4

4 回答 4

7

我有两个问题。

没有充分记录的“Py_NoSiteFlag”修复了

ImportError: No module named site

第一个问题。接下来,我必须更新路径。最后,我最终得到了以下初始化:

Py_NoSiteFlag=1;
Py_SetProgramName(argv[0]);
Py_SetPythonHome(".");
Py_InitializeEx(0);
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path = ['.','python27.zip','python27.zip/DLLs','python27.zip/Lib','python27.zip/site-packages']");

[编辑以解决评论中的问题] 一旦你加载了压缩文件,你仍然需要将文件传递给 python 引擎。这是我使用的(不包括参数和文件存在检查)。

PyObject* PyFileObject = PyFile_FromString(argv[1], "r");
int res = PyRun_SimpleFile(PyFile_AsFile(PyFileObject), argv[1]);

[/编辑]

于 2013-09-02T12:48:27.037 回答
2

我相信您最初的问题是您将文件夹放在 python zip 中,而您应该将DLL 和 Lib 文件夹的内容放入 python zip 中。

而不是这个:

python27.zip
  DLLs
    *.*
  Lib
    *.*

你应该有:

python27.zip
  *.* from DLLs
  *.* from Lib
于 2015-04-15T13:17:30.263 回答
0

请注意,Windows 首先在可执行文件的路径中搜索库,然后才开始在其他位置查找。如果您的 python27.dll 始终放置在可执行文件的路径中,并且您使用 LoadLibrary("python27.dll") 或直接绑定到库,那么您只需始终使用本地 python 版本。如果 \python27-folder 为空,那么您的解释器将失败。如果 dll 不存在,则使用全局解释器。

将 dll 移动到单独的文件夹中,这样 Windows 只会在 LoadLibrary("\p27\python27.dll") 要求时加载它

于 2013-08-29T19:01:21.147 回答
0

好吧,我想在这里发布另一个链接,以防其他人遇到类似问题。不得不说,由于运气不好,我碰巧下载了python 3.3.4,在使用压缩库的时候有一个bug,见http://bugs.python.org/issue20852

于 2014-03-05T01:35:49.473 回答