When to use pip requirements file versus install_requires in setup.py?
我使用pip和virtualenv来打包和安装一些python库。
我可以想象我正在做的是一个非常常见的场景。我是几个库的维护者,我可以为这些库显式地指定依赖项。我的一些库依赖于第三方库,这些库具有我无法控制的可传递依赖项。
我正在尝试实现的是让我的某个库上的pip install下载/安装其所有上游依赖项。在PIP文档中,我正在努力解决的是需求文件是否能够独立完成这些工作,或者它们实际上只是使用install_requires的补充。
我会在所有库中使用install_requires来指定依赖项和版本范围,然后只使用需求文件来解决冲突和/或冻结它们进行生产构建吗?
让我们假设我生活在一个虚构的世界(我知道,我知道),我的上游依赖是直接的,并且保证永远不会冲突或破坏向后兼容性。我到底是被迫使用一个PIP需求文件,还是仅仅让PIP/SETUPTOOLS/Distribute根据install_requires安装所有内容?
在这里有很多类似的问题,但我找不到任何一个像什么时候使用一个或另一个或同时使用它们一样基本的问题。
- 这是一篇很好的文章,解释了两者之间的关系,以及它们是如何集成的。
我的哲学是,install_requires应该表示你所需要的最小值。如果您知道某些版本不起作用,它可能会包含版本要求;但是在您不确定的地方,它不应该有版本要求(例如,您不确定将来的依赖项版本是否会破坏您的库)。
另一方面,需求文件应该指出您所知道的功能,并且可能包括您建议的可选依赖项。例如,您可以使用sqlacalchemy,但建议使用mysql,因此将mysqldb放在需求文件中)。
所以,总而言之:install_requires是让人们远离你知道不工作的事情,而需求文件则是引导人们去做你知道工作的事情。其中一个原因是,总是检查install_requires需求,如果不实际更改包元数据,则无法禁用该需求。所以你不能轻易尝试新的组合。仅在安装时检查需求文件。
- 这是否意味着你应该在requirements.txt中镜像setup.pyinstall_requires=deps?
- 尽管如此,在setup.py和一个需求文件中同时拥有这两个需求是危险的,因为复制只要求变得不同步。
- 另外,那你是怎么处理的呢?我假设,您使用需求文件一次,就可以到达一个确实有效的状态。然后使用带有PIP的实际软件包进行安装。您将永远无法使用-U,因为这可能会覆盖需求文件中的依赖项?如何升级?
- 这个答案同样适用于应用程序和包吗?想象一下,我的web应用程序(一个应用程序)依赖于某个工具(包),这两个工具都依赖于请求包。如果某个工具的requirements.txt文件固定了特定版本或版本范围的请求,这似乎会给我的Web应用程序带来潜在的问题,因为它可能指定了一个冲突的版本/版本范围。
- 应该只有安装软件包的方法。因此,除非您想混淆其他贡献者,否则不建议同时拥有两者。
以下是我在setup.py中的内容:
1 2 3 4 5 6 7
| # this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]
setup(
.....
install_requires=REQUIREMENTS
) |
- 注意,需求文件可能包含注释和内容。您应该使用PIP解析器
- 是的,我最终把这个改成删掉评论。PIP解析器看起来比我的答案好。
- 如果需求文件包含的所有内容都已经在setup.py中,为什么还要使用它呢?
- @罗曼哈杜因,正如你链接答案的评论中所提到的,PIP并不打算这样使用。
- 是的,这对我很有效,直到在需求中需要一个关键的--extra-index-url时,这在我的脸上爆炸了。谢谢@romainhardouin
python packaging用户指南中有一个关于此主题的页面,我强烈建议您阅读:
总结:
install_requires中列出了必须安装包才能使包工作的包的依赖项。它并不打算将依赖项固定到特定的版本,而是接受范围,例如install_requires=['django>=1.8']。install_requires由pip 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。
我只使用过setup.py和install_requires,因为只有一个地方可以看。它就像拥有一个需求文件一样强大,并且没有需要维护的重复。
- 问题是什么时候使用一个或另一个,我没有拼出来,但我的答案是我总是使用一个而不是另一个。怎么不回答这个问题?