首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setuptools setup.py文件中install_requires kwarg的Reference requirements.txt

setuptools setup.py文件中install_requires kwarg的Reference requirements.txt
EN

Stack Overflow用户
提问于 2013-01-18 21:00:14
回答 20查看 164.1K关注 0票数 356

我有一个与Travis-CI一起使用的requirements.txt文件。在requirements.txtsetup.py中复制需求似乎很愚蠢,所以我希望将一个文件句柄传递给setuptools.setup中的install_requires kwarg。

这个是可能的吗?如果是这样的话,我应该怎么做呢?

这是我的requirements.txt文件:

代码语言:javascript
复制
guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4
EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2013-05-18 21:18:25

您可以将其翻转过来,在setup.py中列出依赖项,并在requirements.txt中使用单个字符-一个点.

或者,即使没有建议,仍然可以使用以下攻击(用pip 9.0.1测试)来解析requirements.txt文件(如果它没有通过URL引用任何外部需求):

代码语言:javascript
复制
install_reqs = parse_requirements('requirements.txt', session='hack')

不过,这不会过滤environment markers

在旧版本的pip中,更具体地说是older than 6.0,有一个公共API可以用来实现这一点。需求文件可以包含注释(#),也可以包括其他一些文件(--requirement-r)。因此,如果你真的想解析一个requirements.txt,你可以使用pip解析器:

代码语言:javascript
复制
from pip.req import parse_requirements

# parse_requirements() returns generator of pip.req.InstallRequirement objects
install_reqs = parse_requirements(<requirements_path>)

# reqs is a list of requirement
# e.g. ['django==1.5.1', 'mezzanine==1.4.6']
reqs = [str(ir.req) for ir in install_reqs]

setup(
    ...
    install_requires=reqs
)
票数 295
EN

Stack Overflow用户

发布于 2015-11-13 12:21:25

从表面上看,requirements.txtsetup.py确实是愚蠢的重复,但重要的是要理解,虽然形式相似,但预期的功能却非常不同。

当指定依赖关系时,包作者的目标是说“无论您在哪里安装这个包,这些都是您需要的其他包,以便这个包能够工作。”

相比之下,部署作者(可能在不同的时间是同一个人)有不同的工作,因为他们会说“这是我们收集并测试的包的列表,我现在需要安装它”。

包的作者为各种各样的场景编写,因为他们把他们的工作放在那里,以便以他们可能不知道的方式使用,并且无法知道哪些包将与他们的包一起安装。为了成为一个好邻居,并避免与其他包的依赖版本冲突,他们需要指定尽可能广泛的依赖版本。这就是setup.py中的install_requires所做的。

部署作者为一个非常不同的、非常具体的目标而编写:安装在特定计算机上的已安装应用程序或服务的单个实例。为了精确控制部署,并确保测试和部署正确的包,部署作者必须指定要安装的每个包的确切版本和源位置,包括依赖项和依赖项的依赖项。有了这个规范,一个部署可以重复地应用到多台机器上,或者在一台测试机器上进行测试,部署作者可以确信每次都会部署相同的包。这就是requirements.txt所做的。

因此,您可以看到,虽然它们看起来都像一个很大的包和版本列表,但这两个东西有非常不同的任务。这绝对很容易把它搞混并弄错!但正确的思考方式是,requirements.txt是对所有不同setup.py包文件中的需求所提出的“问题”的“答案”。它通常是通过告诉pip查看一组所需软件包中的所有setup.py文件,找到一组它认为符合所有要求的软件包,然后在安装它们之后,将软件包列表“冻结”到一个文本文件(这就是pip freeze名称的由来)来生成的,而不是手动编写。

因此,结论是:

  • setup.py应该声明仍然可以工作的最宽松的依赖版本。它的工作是说明特定的包可以工作with.
  • requirements.txt是定义整个安装作业的部署清单,而不应该被认为是绑定到任何一个包。它的工作是声明进行部署所需的所有软件包的详尽列表。

这两个东西具有如此不同的内容和存在的原因,简单地将一个复制到另一个是不可行的。

参考文献:

Python打包用户指南中的

票数 286
EN

Stack Overflow用户

发布于 2013-01-18 21:14:48

它不能接受文件句柄。install_requires参数可以only be a string or a list of strings

当然,您可以读取设置脚本中的文件,并将其作为字符串列表传递给install_requires

代码语言:javascript
复制
import os
from setuptools import setup

with open('requirements.txt') as f:
    required = f.read().splitlines()

setup(...
install_requires=required,
...)
票数 121
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14399534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档