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

Joh*_*off 8 python setuptools

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

有没有一种简单的方法来打包安装(包括依赖项)?如果我必须在最终运行它的操作系统/架构上进行构建,这是可以接受的。

就其价值而言,我已经尝试了setup.py build和setup.py sdist,但它们似乎不符合要求,因为它们不包含依赖项。我也考虑过virtualenv(如果绝对必要的话可以安装),但是它具有硬编码路径,这使得它不太理想。

Wra*_*han 4

pip 的工作原理有一些细微差别。不幸的是,--prefix vendor如果任何这些依赖项或依赖项的依赖项安装到 pip 可以找到它们的位置,则用于存储项目的所有依赖项将不起作用。它将跳过这些依赖项,并将其余部分安装到您的vendor文件夹中。

过去我使用 virtualenv 的--no-site-packages选项来解决这个问题。在一家公司,我们会提供整个 virtualenv,其中包括 python 二进制文件。为了仅传送依赖项,您可以将 virtualenv 与--prefixpip 上的开关结合使用,为自己提供一个安装到正确位置的干净环境。

我将提供一个示例脚本,该脚本创建临时 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
Run Code Online (Sandbox Code Playgroud)