无法嵌入python以使用zip'd库

时间:2013-08-25 11:41:59

标签: python python-2.7

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

post似乎描述了这个过程,除了它对我不起作用。

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

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

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

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

PEP273听起来似乎应该可行,但我尝试的所有内容都失败了。

有人能说明如何从zip文件中运行嵌入式python吗?

鉴于有相关的问题没有得到解答,我认为如果人们在成功读取zip文件后会添加评论,即使他们不确定我可能需要什么,也会有所帮助。固定。

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

更新:无论我尝试什么(即使建议使用LoadLibrary),我也可以从完全解压缩的目录运行我的程序。任何时候我用DLLs / *和Lib / *删除目录并放入Python27.zip,我只是得到

ImportError: No module named site

4 个答案:

答案 0 :(得分:6)

我有两个问题。

没有详细记录的'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']");

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

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

[/编辑]

答案 1 :(得分:2)

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

而不是:

python27.zip
  DLLs
    *.*
  Lib
    *.*

你应该:

python27.zip
  *.* from DLLs
  *.* from Lib

答案 2 :(得分:0)

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

将dll移动到一个单独的文件夹中,因此只有在LoadLibrary(“\ p27 \ python27.dll”)

的要求下,Windows才会加载它

答案 3 :(得分:0)

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