如何“构建”具有依赖关系的 python 脚本
Posted
技术标签:
【中文标题】如何“构建”具有依赖关系的 python 脚本【英文标题】:How to "build" a python script with its dependencies 【发布时间】:2013-11-23 12:51:14 【问题描述】:我有一个简单的 python shell 脚本(无 gui),它使用了几个依赖项(请求和 BeautifulfSoup4)。
我想在多台计算机上共享这个简单的脚本。每台计算机都已经安装了 python,并且它们都是 Linux 驱动的。
此时,在我的开发环境中,应用程序在一个包含所有依赖项的 virtualenv 中运行。
有什么方法可以与所有依赖项共享此应用程序,而无需使用 pip 安装它们?
我只想运行python myapp.py
来运行它。
【问题讨论】:
你不使用 pip 的原因是什么?因为这似乎是一个显而易见的解决方案。 因为有些电脑无法安装.. 您解决了这个问题吗?我也无法在系统上安装任何东西,但我可以将我的脚本与所有必要的二进制文件一起发布,并将其放入目录中并执行。很难相信人们从来没有遇到过这样的需求。每个人似乎都只是在他们的服务器上安装所有东西...... 你解决了这个问题吗?我遇到了类似的情况,待解决。请分享 【参考方案1】:您需要创建一个单文件可执行文件,使用 bbfreeze 或 pyinstaller 之类的东西,或者将您的依赖项(假设它们是纯 python)捆绑到一个 .zip
文件中,然后将其作为您的PYTHONPATH(例如:PYTHONPATH=deps.zip python myapp.py
)。
更好的解决方案是创建一个setup.py 文件并使用pip。如果您不希望这些机器访问外部世界,您的 setup.py 文件可以创建文件或存储库的依赖链接。看到这个related issue。
【讨论】:
【参考方案2】:只要您使 virtualenv 可重定位(在其原始位置使用 --relocatable
选项),您就可以直接复制整个 virtualenv。如果您使用--copy-only
创建它(您需要修补 virtualenv 中的错误),那么您甚至不需要在目标机器的其他地方安装 python。
或者,查看http://guide.python-distribute.org/ 并学习如何制作鸡蛋或***。然后可以通过python直接运行一个egg。
【讨论】:
链接不再起作用。一些基于 C 的依赖项呢?如何将它们包含在系统中?我不希望目标系统在系统范围内安装所有东西。我想随包一起运送所有必要的二进制文件……像 JAVA 世界中的 JAR 文件……所有东西都应该是纯 python 和外部的东西。【参考方案3】:我没有测试你的具体案例,但你可以在 github 之类的网站上找到源代码(镜像或原始)。
例如,BeautifulSoup,您可以找到代码here。
您可以将代码放在同一个文件夹中(可能重命名是个好主意,以免调用现有包)。请注意,您不会收到任何更新。
【讨论】:
以上是关于如何“构建”具有依赖关系的 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何将具有依赖项的 python 脚本打包到 zip/tar 中?