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

我用virtualenv使用pip来打包和安装一些Python库。

我会想象我正在做的是一个很常见的情况。 我是几个库的维护者,我可以明确地指定依赖关系。 我的一些库依赖于具有传递依赖关系的第三方库,我无法控制它。

我想要实现的是在我的一个库上pip install来下载/安装所有的上游依赖项。 我在pip文档中苦苦挣扎的是if / how 需要的文件是否可以自己做,或者如果他们真的只是使用install_requires一个补充。

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

让我们假装我生活在一个虚构的世界(我知道,我知道),我的上游依赖是直接的,并保证永不冲突或倒退兼容性。 我会被迫使用一个点的需求文件或只是让pip / setuptools /分发安装一切基于install_requires

在这里有很多类似的问题,但是我找不到什么时候使用这个或那个的基础,或者和谐地使用它们。

我的理念是install_requires应该至less指出你需要什么。 如果知道某些版本不起作用,则可能包含版本要求; 但是在你不确定的时候它不应该有版本要求(例如,你不确定未来的依赖版本是否会破坏你的库)。

另一方面,需求文件应该指出你所知道的工作,并且可能包括你推荐的可选依赖项。 例如,你可能使用SQLAlchemy,但build议MySQL,所以把MySQLdb放在需求文件中)。

所以,总之: install_requires是让人们远离你不知道的事情,而需求文件则可以引导人们走向你所知道的事情。 其中一个原因是, install_requires需求总是被检查,并且不能在实际改变包元数据的情况下被禁用。 所以你不能轻易尝试新的组合。 需求文件只在安装时被检查。

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

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

Python打包用户指南有一个关于这个主题的页面,我强烈build议你阅读它:

  • install_requires vs要求文件

概要:

install_requires在那里列出绝对必须安装的软件包的依赖关系。 这并不意味着将依赖关系固定到特定的版本,但范围是可以接受的,例如install_requires=['django>=1.8'] 。 通过pip install name-on-pypi和其他工具来观察install_requires

requirements.txt只是一个文本文件,您可以select运行pip install -r requirements.txt 。 它意味着所有的依赖关系和子依赖关系的版本固定,像这样: django==1.8.1 。 您可以使用pip freeze > requirements.txt创build一个。 (有些服务,比如Heroku,会自动运行pip install -r requirements.txt 。) pip install name-on-pypi不会查看requirements.txt ,只能在install_requires

我只使用setup.pyinstall_requires因为只有一个地方可以查看。 它与需求文件一样强大,不需要重复维护。