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

2024-10-01 17:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python项目,它有一些依赖项(在install_requires中定义)设置.py). 我的ops人员需要一个自包含的包,并且只依赖于python安装。试金石是,他们能够获得一个zip文件,然后解压并运行它,而不需要互联网连接。在

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

不管怎样,我尝试了setup.py build和{},但它们似乎不适合这个要求,因为它们不包含依赖关系。我还考虑过virtualenv(如果绝对必要,可以安装它),但是它有硬编码的路径,这使得它不太理想。在


Tags: install文件项目方法pybuild定义人员
3条回答

在大多数情况下,您应该能够“提供”所有依赖项。它基本上是virtualenv的原始版本。在

例如,看看requestsincludes chardet and urllib3在其自己的源树中是如何工作的。下面是一个示例脚本,它应该为您完成初始下载和复制:https://gist.github.com/proppy/1136723

一旦安装了依赖项,就可以使用from .some.namespace import dependency_name引用它们,以确保使用的是本地版本。在

pip的工作原理有一些细微差别。不幸的是,使用 prefix vendor来存储项目的所有依赖项,如果这些依赖项或依赖项的任何依赖项被安装到pip可以找到它们的地方,那么就不能使用这些依赖项。它将跳过这些依赖项,只将其余部分安装到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

在最新版本的pip(我使用的是8.1.2)是可以做到这一点的。在生成计算机上:

pip install -r requirements.txt  prefix vendor

然后运行它:

^{pr2}$

(这基本上是@valentjedi评论的扩展。谢谢!)在

相关问题 更多 >

    热门问题