什么时候使用pip需求文件而不是setup.py中的install_requires?
我正在使用pip和virtualenv来打包和安装一些Python库。
我想我做的事情是一个很常见的场景。我是几个库的维护者,可以明确指定它们的依赖关系。我的一些库依赖于第三方库,而这些库又有其他依赖关系,我对此没有控制权。
我想要实现的是,当我对我的某个库使用pip install
时,能够下载并安装它所有的上游依赖关系。我在pip的文档中遇到的问题是,requirements文件是否可以单独做到这一点,还是说它们只是用来补充install_requires
的。
我是否应该在我所有的库中使用install_requires
来指定依赖关系和版本范围,然后只在需要解决冲突或为生产构建锁定版本时使用requirements文件呢?
假设我生活在一个虚构的世界(我知道,我知道),我的上游依赖关系很简单,并且保证不会有冲突或破坏向后兼容性。我是否真的需要使用pip的requirements文件,还是可以仅仅依靠pip/setuptools/distribute根据install_requires
来安装所有内容呢?
这里有很多类似的问题,但我找不到任何关于何时使用其中一个,或者如何和谐地同时使用它们的基本问题。
4 个回答
Python打包用户指南里有一页专门讲这个话题,我强烈推荐你去看看:
总结:
install_requires
是用来列出这个包运行所必需的依赖项,也就是你必须安装的东西。如果不安装这些依赖,包就无法正常工作。它并不是用来锁定依赖的具体版本,但可以指定一个版本范围,比如 install_requires=['django>=1.8']
。当你使用 pip install name-on-pypi
这样的命令时,它会关注 install_requires
。
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文件里写的内容:
# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]
setup(
.....
install_requires=REQUIREMENTS
)
我的观点是,install_requires
应该列出你需要的最低要求。它可以包含版本要求,如果你知道某些版本不兼容的话;但如果你不确定某个未来版本的依赖是否会影响你的库,就不应该写上版本要求(比如你不确定未来的某个依赖更新会不会坏掉你的库)。
而需求文件则应该列出你知道可以正常工作的东西,也可以包括你推荐的可选依赖。例如,你可能会使用 SQLAlchemy,但建议使用 MySQL,所以在需求文件中就可以加入 MySQLdb。
总结一下:install_requires
是为了让人们避免使用那些你知道不工作的东西,而需求文件则是引导人们使用那些你知道可以正常工作的东西。这样做的一个原因是,install_requires
中的要求总是会被检查,而且不能在不改变包的元数据的情况下禁用。所以你不能轻易尝试新的组合。而需求文件只在安装时被检查。