我正在使用带有virtualenv的pip来打包和安装一些Python库。
我想我正在做的是一个很常见的场景。我是几个库的维护者,我可以明确地指定依赖项。我的一些库依赖于第三方库,这些库具有我无法控制的传递依赖性。
我想要实现的是我的一个库上的pip install
下载/安装其所有上游依赖项。在pip文档中我正在努力的是if / how requirements files可以自己做什么,或者它们是否只是使用install_requires
的补充。
我是否会在所有库中使用install_requires
来指定依赖项和版本范围,然后仅使用需求文件来解决冲突和/或冻结它们以进行生产构建?
让我假装我生活在一个虚构的世界(我知道,我知道),我的上游依赖是直截了当的,保证永远不会冲突或破坏向后兼容性。我是否会被迫使用pip要求文件或者只是让pip / setuptools / distribute根据install_requires
安装所有内容?
这里有很多类似的问题,但是我找不到任何与使用其中一个或者和谐地使用它们一样基本的问题。
答案 0 :(得分:65)
我的理念是install_requires
应该表明你需要的最低限度。如果您知道某些版本无效,则可能包含版本要求;但它不应该有您不确定的版本要求(例如,您不确定将来的依赖版本是否会破坏您的库)。
另一方面,需求文件应指明 的工作原理,并且可能包含您推荐的可选依赖项。例如,您可以使用SQLAlchemy但建议使用MySQL,因此将MySQLdb放在需求文件中。)
因此,总而言之:install_requires
是让人们远离那些你知道不起作用的东西,而要求文件引导人们走向你认识的事情。其中一个原因是install_requires
要求始终检查,并且在未实际更改包元数据的情况下无法禁用。所以你不能轻易尝试新的组合。只在安装时检查需求文件。
答案 1 :(得分:13)
这是我在setup.py中的内容:
# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]
setup(
.....
install_requires=REQUIREMENTS
)
答案 2 :(得分:7)
“Python包装用户指南”有一个关于此主题的页面,我强烈建议您阅读它:
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
。
答案 3 :(得分:5)
我只使用setup.py
和install_requires
,因为只有一个地方可以看。它与拥有需求文件一样强大,并且没有重复维护。