【问题标题】:Unable to get python embedded to work with zip'd library无法嵌入 python 以使用压缩库
【发布时间】:2013-08-28 00:37:48
【问题描述】:

我正在尝试嵌入 python,并提供 dll 和 python 库的 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 听起来应该可以正常工作,但我尝试过的一切都失败了。

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

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

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

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

ImportError: No module named site

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    我有两个问题。

    没有充分记录的“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']");
    

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

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

    [/编辑]

    【讨论】:

    • 这是解决方案吗?如果没有,您能否编辑您的初始帖子?
    • 这对我有用。如果有人贡献了新的东西,我会推迟,因为我没有得到奖励来回答我自己的问题。赏金已过期,标记为答案。
    • 此解决方案部分适用于我 - 如果我使用 python27.zip 和 Py_NoSiteFlag,我可以将 Python 加载到内存中,但我无法导入我的自定义包。请注意,使用未压缩的 Python 文件夹时一切正常。会不会和site.py没有被导入有关?
    • @BrettStottlemyer 我和你有同样的问题,你能告诉你把你的 .py 文件放在哪里了吗?例如,如果您创建了一个文件名 mine.py 并在嵌入时使用了它。你会把它放在哪里?
    【解决方案2】:

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

    而不是这个:

    python27.zip
      DLLs
        *.*
      Lib
        *.*
    

    你应该有:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 问题不在于它选择了错误的python。问题是它没有从 zip 文件中加载任何内容。这是使用本地版本时。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 1970-01-01
        • 2015-09-11
        • 2011-08-29
        相关资源
        最近更新 更多