31

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

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

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

4

3 回答 3

12

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

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

于 2012-07-11T16:43:53.533 回答
4

最简单的方法是将__main__.py使用纯 Python 依赖项命名的 Python 脚本放在一个 zip 存档中,例如.

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

于 2012-07-11T17:03:26.313 回答
1

请不要这样做。如果你这样做,不要养成它的习惯。

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