【问题标题】:Is there a way to embed dependencies within a python script?有没有办法在 python 脚本中嵌入依赖项?
【发布时间】:2012-07-11 16:05:25
【问题描述】:

我有一个简单的脚本,它依赖于dnspython 来解析区域文件。我想将此脚本作为单个 .py 分发,用户只要安装了 2.6/2.7 就可以运行该脚本。我不想让用户在站点范围内安装依赖项,因为可能与现有的包/版本发生冲突,我也不希望他们与 virtualenv 混在一起。我想知道是否有办法在脚本(gzip/base64)中嵌入像 dnspython 这样的包,并让该脚本在运行时访问该包。也许将其解压缩到 /tmp 中的目录并将其添加到 sys.path?我不关心启动开销,我只想要一个包含所有依赖项的单个 .py,我可以分发它。

此外,没有 C 依赖项要构建,只有纯 python 包。

编辑:脚本不必是 .py。只要它是单个可执行文件即可。

【问题讨论】:

  • 如果您可以放宽一个文件的限制,您可以将 dnspython 库与您的 .py 文件一起打包,作为 zip 文件或作为常规独立文件 - 这将解决依赖问题.你坚持只有 1 个文件吗?
  • 通向许可证地狱的道路是用嵌入铺就的......
  • @MahmoudAbdelkader 我想这会奏效。 Python 会先在当前目录中查找包,然后再查找其他位置(尽管我认为此顺序在 3 中发生了变化)。仍然希望有一种方法可以将所有依赖项打包为一个可执行文件,用户可以运行并且没有任何问题。我想它不一定是.py。
  • 有像py2exe 和freeze 这样的东西是专门为了分发一个可执行文件而发明的。不过,这些是特定于平台的。

标签: python


【解决方案1】:

您可以将多个 Python 文件打包成一个 .egg。 Egg 文件本质上只是具有明确定义的元数据的 zip 存档 - 查看 setuptools 文档以了解如何执行此操作。根据docs,您可以通过指定入口点使 egg 文件直接可执行。这将为您提供一个可执行文件,其中可以包含您的代码 + 任何其他依赖项。

编辑:现在我建议建立一个 pex 来做到这一点。 pex 基本上是一个具有非 stdlib 依赖项的可执行 zip 文件。它不包含 python 发行版(如 py2app/py2exe),但包含其他所有内容,并且可以使用单个命令行调用来构建。 https://pex.readthedocs.org/en/latest/

【讨论】:

  • 谢谢,我刚才正在尝试用 setuptools 构建一个鸡蛋。以前从来没有造过鸡蛋,因为我一直听说他们已经失宠了。
【解决方案2】:

最简单的方法是将名为__main__.py 的python 脚本与纯Python 依赖项放在一个zip 存档example 中。

否则PyInstaller 可用于生成独立的可执行文件。

【讨论】:

    【解决方案3】:

    请不要这样做。如果您不这样做,请不要养成习惯。

    • pydns 已获得 BDS 许可,但如果您尝试以这种方式“嵌入”gpl 模块,您可能会遇到麻烦
    • 你可以学习使用setuptools,从长远来看你会更快乐
    • setuptools 将处理您确定的依赖项的安装(我不确定您使用的 pydns 是否是纯 python,因此如果您尝试在不了解用户环境的情况下自行添加,可能会给用户带来问题)
    • 您可以设置一个 url 或 pypi,以便人们可以使用 easy_install -U 升级您的脚本

    【讨论】:

    • 我使用的包是dnspython,不是pydns。如果 setuptools 可以为我构建一个只需要 python 2.6/2.7 的可分发可执行文件,我将使用它。如果您说简单地使用它在站点范围内安装依赖项,那么这不是我所要求的。 dnspython 是纯 python,我在它的许可证中看不到任何会阻止我嵌入它的东西。最终用户不是开发人员,对 python 生态系统一无所知(setuptools/easy_install/pip/virtaulenv/etc)。
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2019-09-03
    • 1970-01-01
    相关资源
    最近更新 更多