105

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

我想我正在做的是一个很常见的场景。我是几个库的维护者,我可以为其明确指定依赖项。我的一些库依赖于第三方库,这些库具有我无法控制的传递依赖。

我想要实现的是让pip install我的一个库下载/安装其所有上游依赖项。我在 pip 文档中苦苦挣扎的是,需求文件是否/如何可以自己执行此操作,或者它们是否真的只是使用install_requires.

我会在我install_requires的所有库中使用来指定依赖项和版本范围,然后只使用需求文件来解决冲突和/或冻结它们以进行生产构建吗?

假设我生活在一个虚构的世界中(我知道,我知道),并且我的上游依赖项很简单,并且保证不会发生冲突或破坏向后兼容性。我会被迫使用 pip 需求文件,还是让 pip/setuptools/distribute 安装所有基于的东西install_requires

这里有很多类似的问题,但我找不到任何一个基本的问题,比如何时使用其中一个或同时使用它们。

4

4 回答 4

70

我的理念是,这install_requires应该表明您需要的最低限度。如果您知道某些版本不起作用,它可能包括版本要求;但它不应该有您不确定的版本要求(例如,您不确定未来版本的依赖项是否会破坏您的库)。

另一方面,需求文件应该表明你知道什么有效的,并且可能包括你推荐的可选依赖项。例如,您可能使用 SQLAlchemy 但建议使用 MySQL,因此将 MySQLdb 放在需求文件中)。

所以,总而言之:install_requires就是让人们远离你知道不起作用的事情,而需求文件引导人们去做你知道有效的事情。这样做的一个原因是install_requires要求总是被检查,并且不能在不实际更改包元数据的情况下禁用。所以你不能轻易尝试新的组合。仅在安装时检查需求文件。

于 2011-08-16T21:04:48.743 回答
22

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

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

setup(
    .....
    install_requires=REQUIREMENTS
)
于 2013-03-11T14:26:55.913 回答
15

Python Packaging User Guide 有一个关于这个主题的页面,我强烈推荐你阅读它:

概括:

install_requires是否列出了必须安装才能使包正常工作的包的依赖项。这并不意味着将依赖项固定到特定版本,但可以接受范围,例如install_requires=['django>=1.8']. install_requirespip 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.

于 2016-10-12T13:41:08.380 回答
7

我只使用setup.pyandinstall_requires因为只有一个地方可以看。它与拥有需求文件一样强大,并且无需维护重复项。

于 2013-11-13T16:43:14.463 回答