将包添加到适用于 Windows 的 Python“嵌入式”安装

Posted

技术标签:

【中文标题】将包添加到适用于 Windows 的 Python“嵌入式”安装【英文标题】:Adding packages to Python "embedded" installation for Windows 【发布时间】:2018-09-19 03:13:05 【问题描述】:

来自the documentation:

嵌入式发行版是一个 ZIP 文件,其中包含一个最小的 Python 环境。

听起来不错! Python 的 64 位 Windows Embedded v3.6.5 只有 13MB。作为编译的替代方法,我想将一些 python 脚本连同在没有安装 Python 的 Win10 机器上运行它们所需的最低要求一起压缩。

现在,我几乎总是需要导入额外的包来提供功能。但是,如果我想将 python 脚本与这个嵌入式版本的 Python 一起发送,我无法确定我应该如何执行此操作。例如,如果我的脚本使用 numpy,我如何在这个“嵌入”中包含该库?即,以便在任何 Win10 机器上解压缩单个部署文件并立即执行我的脚本?

(普通的pip install numpy 似乎创建了一个超过 50MB 的 Lib 子目录!但对于“嵌入式”部署,我不需要任何调试支持或包含在大量文件中的任何其他内容。)

【问题讨论】:

您是否有理由不能使用requirements.txt,然后让它们在执行脚本之前运行pip install -r requirements.txt @AaronN.Brock:文档警告:此发行版不支持像常规 Python 安装那样使用 pip 来管理依赖项,但请注意它可能包含和使用pip 用于自动更新。 我想如果我对该警告的阅读过多,我可以尝试一下.... modulefinder 可能会派上用场。检查***.com/questions/39539089/… 看看我是如何使用它的。 相关:pip with embedded python 【参考方案1】:

有一种方法可以扩展 Python 嵌入式安装。 我设法创建了 Flask-ready 包,我可以在目标机器上解压缩并运行代码。 诀窍是安装 EXACT same python 版本(普通的完整 python)作为您的目标嵌入式小型 python。不仅版本要匹配,x86、x64也要匹配。

然后在普通 python 上从 pip 安装模块,转到 NormalPython\Lib\site-packages 并将安装包后出现的所有新文件复制到 EmbeddedPython\Lib 最后将 LibLib\site-packages 添加到 pythonXX._pth 内 Embedded python 文件夹。

全面测试您的应用程序非常重要,以防您错过某些软件包。 这也不适用于将 .exe 添加到 Scripts 文件夹的软件包。 您仍然可以将 exe 复制到 Script 文件夹并将其添加到可以解决问题的路径中。

【讨论】:

在没有 ._pth 文件的情况下,如果他们的potential deprecation in Python 3.8,你将如何做到这一点? I found a more explicit script-based explanation 似乎遵循这种模式,但压缩了依赖项。 (它也使用 _pth。) 如果您不确定需要将什么文件复制到嵌入式安装中:导入 然后 .__file__ 应该可以解决问题 @Todd - 我们现在已经进入 3.10,但仍然没有弃用 _pth 文件的迹象。那次讨论,以及由此产生的PEP(无论如何都被拒绝了),似乎从来没有完全专注于完全摆脱这些文件(除了在开头的一些热门帖子之外)线程)。他们最初的预期用途是允许调整到sys.path,这是绝大多数开发人员仍然认为是个好主意,并且绝对不会很快消失,即使任意代码执行确实被删除了。 【参考方案2】:

有一种方法可以扩展 Python 嵌入式安装。诀窍是安装与目标嵌入式 python 相同的 python 版本(我称之为 NormalPython)(我称之为 EmbeddedPython)。版本和架构必须完全匹配。

然后您在 NormalPython 上从 pip 安装模块。您可以在 NormalPython\Scripts 上找到 pip。

转到 NormalPython\Lib\site-packages 并将安装后出现的所有文件复制到 EmbeddedPython\Lib\

然后将Lib添加到嵌入式python文件夹中的pythonXX._pth。

在通过 https://www.python.org/downloads/windows/ 下载最新的 python 嵌入和 python 安装后,这对我在 Windows 10 上有效。 我使用了 Michal Rawluk 的答案,但它有点难以理解,所以我试图用不同的方式来解释它。

【讨论】:

【参考方案3】:

有一个类似的技巧。

    在嵌入式版本中安装 pip:

    curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py

    python get-pip.py

    通过添加编辑pythonXX._pth

    库\站点包

    使用 pip 安装其他包

【讨论】:

您可能希望更准确地引用“类似技巧”。你指的是另一个答案吗?然后你可以注意“类似于xyz答案的技巧”

以上是关于将包添加到适用于 Windows 的 Python“嵌入式”安装的主要内容,如果未能解决你的问题,请参考以下文章

cx_freeze:如何将包文件添加到 library.zip 中?

在 Python 中编写适用于 Windows 中的 Python 2.7+ 和 Python 3.3+ 的 .CSV 文件

无法在适用于 Windows 的 Python 3.7 上安装 win32core

Python环境搭建

在 Windows 上安装离子推送插件(适用于 iOS)时出错

适用于 XP 的 Windows 防火墙规则