有没有办法在python脚本中嵌入依赖项?

时间:2012-07-11 16:05:25

标签: python

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

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

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

  • pydns已获得BDS许可,但如果您试图以这种方式“嵌入”gpl模块,则可能会遇到麻烦
  • 你可以学会使用setuptools,从长远来看你会更开心
  • setuptools将处理您识别的依赖项的安装(我不确定您使用的pydns是否是纯Python,因此如果您尝试在不知道其环境的情况下自行添加它,可能会为您的用户带来问题)
  • 您可以设置网址或者pypi,以便人们可以使用easy_install -U
  • 升级您的脚本