使用依赖项打包python项目的标准方法是什么?

时间:2016-07-07 10:55:06

标签: python setuptools

我有一个python项目,它有一些依赖项(在setup.py中的install_requires下定义)。我的操作人员需要一个自包含的包,只依赖于python安装。石蕊试验是他们能够获得一个zip文件,然后在没有互联网连接的情况下解压缩并运行它。

是否有一种简单的方法来打包包含依赖项的安装?如果我必须在OS /架构上构建它最终将运行它是可以接受的。

对于它的价值,我已经尝试了setup.py buildsetup.py sdist,但由于它们不包含依赖项,因此它们似乎不适合该法案。我也考虑过virtualenv(如果绝对必要的话可以安装),但它有硬编码路径,这使得它不太理想。

3 个答案:

答案 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的原始版本。

例如,查看自己的源代码树中requestsincludes 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评论的扩展。谢谢!)