67

我正在使用pip 需求文件来保存我的依赖项列表。

我还尝试遵循管理依赖项的最佳实践,并在需求文件中提供精确的包版本。例如:

Django==1.5.1
lxml==3.0

问题是:有没有办法告诉 Python 包索引中列出的包有任何更新的包版本requirements.txt

对于这个特定示例,当前最新的可用版本分别是 Django 和 lxml 的 1.6.2 和 3.3.4。

我试过pip install --upgrade -r requirements.txt了,但它说一切都是最新的:

$ pip install --upgrade -r requirements.txt 
Requirement already up-to-date: Django==1.5.1 ...

请注意,此时我不想运行实际升级——我只想看看是否有可用的更新。

4

4 回答 4

118

Pip 内置了这个功能。假设你在你的 virtualenv 类型中:

$ pip list --outdated
psycopg2 (Current: 2.5.1 Latest: 2.5.2)
requests (Current: 2.2.0 Latest: 2.2.1)

$ pip install -U psycopg2 requests

之后,将下载并安装新版本的 psycopg2 和请求。然后:

$ pip freeze > requirements.txt

你完成了。这不是一个命令,但优点是您不需要任何外部依赖项。

于 2014-04-16T07:28:47.030 回答
39

刚刚找到了一个专门针对这个任务的python包——piprot,标语如下:

How rotten are your requirements?

使用起来非常简单:

$ piprot requirements.txt 
Django (1.5.1) is 315 days out of date. Latest is 1.6.2
lxml (3.0) is 542 days out of date. Latest is 3.3.4
Your requirements are 857 days out of date

您也可以“管道”pip freezepiprot命令,因此它实际上可以检查安装在沙盒/虚拟环境中的软件包有多烂:

pip freeze | piprot

希望这对将来的人有所帮助。

于 2014-04-08T20:48:21.923 回答
10

既然你提到你喜欢遵循最佳实践,我猜你也在使用 virtualenv,对吗?假设是这种情况,并且由于您已经固定了您的包,有一个名为pip-tools 的工具,您可以针对您的 virtualenv 运行它来检查更新。

有一个缺点,以及为什么我提到了 virtualenv 的使用。

[该工具] 检查 PyPI 并报告可用更新。它使用当前安装的软件包列表来检查更新,它不使用任何 requirements.txt

如果你在你的 virtualenv 中运行它,你可以很容易地看到哪些包有可用于你当前活动环境的更新。但是,如果您不使用 virtualenv,最好不要在系统上运行它,因为您的其他项目可能依赖于不同的版本(或者即使它们当前都可以正常工作,也可能无法与更新的版本一起工作)。

从提供的文档来看,使用很简单。向pip-review您显示可用的更新,但不会安装它们。

$ pip-review
requests==0.13.4 available (you have 0.13.2)
redis==2.4.13 available (you have 2.4.9)
rq==0.3.2 available (you have 0.3.0)

如果您也想自动安装,该工具也可以处理:$ pip-review --auto. 还有一个--interactive开关可用于有选择地更新软件包。

完成所有这些后,pip-tools提供一种使用最新版本更新您的 requirements.txt 的方法:pip-dump. 同样,这针对当前活动的环境运行,因此建议在 virtualenv 中使用。

项目的安装可以通过pip install pip-tools.

作者注:我已经将它用于小型 Django 项目并且对此非常满意。但是,请注意,如果您安装pip-tools到虚拟环境中,当您运行时,pip-dump您会发现它已添加到您的 requirements.txt 文件中。由于我的项目很小,我总是手动删除该行。如果您有某种构建脚本,您可能希望在部署之前自动将其剥离。

于 2014-04-08T18:43:23.213 回答
6

你可以在你的环境(虚拟或非虚拟)中简单地做这样的事情:

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
于 2014-04-08T18:29:13.703 回答