我使用pip和virtualenv来打包和安装一些Python库。
我想我正在做的是一个很常见的场景。我是几个库的维护者,我可以显式地指定它们的依赖关系。我的一些库依赖于第三方库,这些库具有我无法控制的可传递依赖关系。
我想要实现的是我的一个库上的pip install
下载/安装其所有的上游依赖项。我在pip文档中挣扎的是需求文件是否/如何自己做到这一点,或者它们是否真的只是使用install_requires
的补充。
我会在我所有的库中使用install_requires
来指定依赖关系和版本范围,然后只使用需求文件来解决冲突和/或冻结它们用于生产构建吗?
让我们假设我生活在一个想象的世界中(我知道,我知道),我的上游依赖关系是直接的,并且保证永远不会冲突或破坏向后兼容性。我是否必须使用pip需求文件,或者只是让pip/setuptools/distribution安装基于install_requires
的所有内容?
这里有很多类似的问题,但我找不到任何一个像什么时候使用一个或另一个或两者和谐使用一样基本的问题。
我的理念是install_requires
应该表示您需要的最小值。如果你知道某些版本不能工作,它可能包括版本要求;但是它不应该有你不确定的版本要求(例如,你不确定一个依赖的未来版本是否会破坏你的库)。
需求文件应该表明您所知道的所做的工作,并且可能包括您推荐的可选依赖项。例如,您可能使用SQLAlchemy,但建议使用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打包用户指南有一个关于这个主题的页面,我强烈建议你阅读:
- install_requires vs Requirements files
简介:
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
,因为只有一个地方可以看。它就像拥有一个需求文件一样强大,并且没有需要维护的副本。