何时在setup.py中使用pip需求文件而不是install_requires?


94

我使用带有virtualenv的pip打包和安装了一些Python库。

我想我正在做的是一个很普通的场景。我是几个库的维护者,可以为它们明确指定依赖项。我的一些库依赖于第三方库,这些第三方库具有我无法控制的传递依赖项。

我想要实现的是pip install在我的一个库中下载/安装其所有上游依赖项。我在pip文档中苦苦挣扎的是,需求文件是否能够/如何独立执行,或者是否真的只是对using的补充install_requires

我会install_requires在所有库中使用它来指定依赖项和版本范围,然后仅使用需求文件来解决冲突和/或冻结它们以进行生产构建吗?

让我们假装我生活在一个虚构的世界中(我知道,我知道),并且我的上游依存关系很简单,并且保证不会发生冲突或破坏向后兼容性。我会被迫完全使用pip要求文件,还是只是让pip / setuptools / distribute根据以下内容安装所有内容install_requires

这里有很多类似的问题,但是我找不到最基本的问题,如何时使用一个或另一个或和谐地使用它们。


3
是一篇非常不错的文章,解释了两者之间的关系以及它们如何集成。
比约恩博动

Answers:


68

我的理念是install_requires表明您所需要的最少。如果您知道某些版本将无法使用,则可能包括版本要求。但是不确定的地方应该没有版本要求(例如,不确定将来的依赖版本是否会破坏您的库)。

要求在另一方面文件应说明你知道什么的工作,并可能包括可选的依赖,你建议。例如,您可能使用SQLAlchemy但建议使用MySQL,因此将MySQLdb放入需求文件中。

因此,总而言之:install_requires是让人们远离您不知道的事情,而需求文件则引导人们朝着您知道的事情起作用。原因之一是install_requires必须始终检查需求,并且在不实际更改软件包元数据的情况下不能禁用需求。因此,您不能轻易尝试新的组合。需求文件仅在安装时检查。


5
这是否意味着您应该镜像setup.py install_requires=侦探requirements.txt
proppy

9
但是,在setup.py和需求文件中同时拥有需求是很危险的,因为重复只是要求不同步。
塞巴斯蒂安·布拉斯克

1
另外,您实际如何使用它呢?我想,您只需使用需求文件一次即可进入肯定有效的状态。然后使用pip与实际的软件包一起安装。您将永远无法使用,-U因为这可能会覆盖需求文件中的依赖项?您如何升级?
塞巴斯蒂安·布拉斯克

1
这个答案是否同样适用于应用程序和软件包?想象一下my-web-app(一个应用程序)取决于某些工具(一个包),这两个都取决于请求包。如果some-tool的Requirement.txt文件固定了请求的特定版本或版本范围,那么似乎对my-web-app可能会造成潜在问题,因为它可能指定了冲突的版本/版本范围。
Reece 2014年

2
应该只有安装软件包的方法。因此,除非您想混淆其他贡献者,否则不建议同时使用两者。
Gewthen

17

这是我在setup.py中输入的内容:

# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]

setup(
    .....
    install_requires=REQUIREMENTS
)

20
请注意,需求文件可能包含评论和包含内容。您应该使用点子解析器
Romain Hardouin 2013年

1
是的,我最终将其更改为删除评论。点解析器看起来比我的答案更好。
rbp

7
如果全部包含在setup.py中,为什么还要使用需求文件?
塞巴斯蒂安·布拉斯克

2
@RomainHardouin,如对链接的答案的评论中所述,pip并不意味着要使用这种方式。
akaihola 2014年

1
是的,这对我一直有效,直到需要严格--extra-index-url处理需求为止,这使我震惊。感谢@RomainHardouin
Tommy

11

《 Python打包用户指南》中有关于此主题的页面,我强烈建议您阅读以下内容:

摘要:

install_requires这里列出了软件包必须完全安装的依赖关系,软件包才能正常工作。这并不意味着将依赖项固定到特定版本,但是可以接受范围install_requires=['django>=1.8']install_requirespip install name-on-pypi其他工具观察到。

requirements.txt只是一个文本文件,您可以选择对其运行pip install -r requirements.txt。这意味着要固定所有依赖项和子依赖项的版本,如下所示:django==1.8.1。您可以使用创建一个pip freeze > requirements.txt。(一些服务,像Heroku的,自动运行pip install -r requirements.txt您。)pip install name-on-pypi根本就看不到requirements.txt,只有在install_requires


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.