我有一个python项目,它有一些依赖项(在setup.py中的install_requires
下定义)。我的操作人员需要一个自包含的包,只依赖于python安装。石蕊试验是他们能够获得一个zip文件,然后在没有互联网连接的情况下解压缩并运行它。
是否有一种简单的方法来打包包含依赖项的安装?如果我必须在OS /架构上构建它最终将运行它是可以接受的。
对于它的价值,我已经尝试了setup.py build
和setup.py sdist
,但由于它们不包含依赖项,因此它们似乎不适合该法案。我也考虑过virtualenv
(如果绝对必要的话可以安装),但它有硬编码路径,这使得它不太理想。
答案 0 :(得分:4)
pip如何运作有一些细微差别。不幸的是,如果将任何依赖项或依赖项的依赖项安装到pip可以找到它们的地方,使用--prefix vendor
来存储项目的所有依赖项都不起作用。它将跳过这些依赖项,并将其余部分安装到您的vendor
文件夹中。
过去我曾使用virtualenv的--no-site-packages
选项来解决这个问题。在一家公司,我们将发送整个virtualenv,其中包括python二进制文件。为了只运送依赖项,您可以使用virtualenv和pip上的--prefix
开关组合,为自己提供一个安装到正确位置的干净环境。
我将提供一个示例脚本,用于创建临时virtualenv,激活它,然后将依赖项安装到本地vendor
文件夹。如果您在CI中运行,这很方便。
#!/bin/bash
tempdir=$(mktemp -d -t project.XXX) # create a temporary directory
trap "rm -rf $tempdir" EXIT # ensure it is cleaned up
# create the virtualenv and exclude packages outside of it
virtualenv --python=$(which python2.7) --no-site-packages $tempdir/venv
# activate the virtualenv
source $tempdir/venv/bin/activate
# install the dependencies as above
pip install -r requirements.txt --prefix=vendor
答案 1 :(得分:1)
在大多数情况下,您应该能够"供应商"所有的依赖。它基本上是virtualenv的原始版本。
例如,查看自己的源代码树中requests
包includes chardet and urllib3的方式。这是一个示例脚本,应该为您进行初始下载和复制:https://gist.github.com/proppy/1136723
安装完依赖项后,您可以使用from .some.namespace import dependency_name
引用它们,以确保您使用的是本地版本。
答案 2 :(得分:0)
可以使用pip
的最新版本(我正在使用8.1.2)执行此操作。在构建机器上:
pip install -r requirements.txt --prefix vendor
然后运行它:
PYTHONPATH=vendor/lib/python2.7/site-packages python yourapp.py
(这基本上是@valentjedi评论的扩展。谢谢!)