检查需求是否已经更新至最新版本。

78

我正在使用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个回答

135

Pip已经内置了此功能。假设你在你的虚拟环境中,请输入:

$ 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和requests。然后:

$ pip freeze > requirements.txt

完成了。这不是一个命令,但好处是您无需任何外部依赖。


4
这是正确的答案。其他的答案也有用,但是这个答案不需要额外的工具。 - 0atman
pip list --outdated 运行缓慢,对于安装了许多软件包的情况。而 pip search <package> 并不是很有用 - 它将开发版本作为最新版本,并产生太多垃圾信息。是否有一种命令可以精确检查一个或几个软件包的更新情况(这实际上会在 pip install -U 中发生),从而进行模拟运行? - kxr
@kxr 刚刚查看了 pip 文档以确保,截至今天我认为这是不可能的。 - Max Tepkeev

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 freeze的输出通过“管道”符号连接到piprot命令,这样它就能实际检查安装在沙盒/虚拟环境中的软件包是否已经过时:

pip freeze | piprot

希望这对未来的某个人有所帮助。


6
真爱 piprot 在最后加起来所有的天数。 - tobych
3
@TobyChampion 是的,有时候这让人感到沮丧 - 尤其是当你知道你无法升级一个发布已经超过1年的东西 :) - alecxe
pip freeze | piprot 对我不起作用:piprot(0.9.6)和pip(1.5.6)。无论如何,piprot requirements.txt 的效果非常好。 - yucer
2
不再维护 :( - Sohaib Farooqi
3
对我不起作用,当我尝试使用它时出现“KeyError:'releases'”错误。 - Roberto Leinardi

10

由于您提到您喜欢遵循最佳实践,我猜测您也在使用virtualenv,是吗?假设是这样,而且既然您已经pinning了您的包,那么有一个工具叫做pip-tools,您可以在虚拟环境中运行它来检查更新。

但是,使用virtualenv也有缺点,这也是为什么我提到了它。

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

如果您在虚拟环境中运行它,您可以轻松地看到哪些软件包有更新可用于您当前的活动环境。 但是,如果您不使用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文件中。由于我的项目很小,我总是手动删除那行。如果您有某种构建脚本,可能需要在部署之前自动剥离它。

“pip-tools” 绝对是我要使用的软件包,谢谢您指出来。同时请查看我提供的答案:据我所知,“pip-tools” 与您的虚拟环境一起工作,但 “piprot” 使用“仅限要求”的方法,对吗? - alecxe
@alecxe 这就是它的样子。我以前没见过 piprot。那看起来也很有趣。谢谢你指出来。 - Andy
2
刚刚安装了最新版本的 pip-tools,但是我的路径中没有 pip-review 文件。有什么变化吗? - Vadim Kotov
不知道是否是同样的问题(我也有你的问题@vadim,但在这里找到了pip-review:https://github.com/jgonggrijp/pip-review)。 - thorwhalen
pip-review已经被移入另一个项目,正如@thorwhalen已经提到并链接的那样。此处讨论原因 - RoachLord

5
新的:
此外
$ pip list --outdated

$ pip install pip-check
$ pip-check

示例输出:
┌───────────────────────────┬────────────┬──────────┬────────────────────────────────────────────────────────┐
│ Major Release Update      │ Version    │ Latest   │                                                        │
├───────────────────────────┼────────────┼──────────┼────────────────────────────────────────────────────────┤
│ aiofiles                  │ 22.1.0     │ 23.1.0   │ https://pypi.python.org/pypi/aiofiles                  │
│ auth0-python              │ 3.22.0     │ 4.3.0    │ https://pypi.python.org/pypi/auth0-python              │
│ certifi                   │ 2022.12.7  │ 2023.5.7 │ https://pypi.python.org/pypi/certifi                   │
│ cryptography              │ 40.0.2     │ 41.0.2   │ https://pypi.python.org/pypi/cryptography              │
└───────────────────────────┴────────────┴──────────┴────────────────────────────────────────────────────────┘

┌────────────────────────────────────────┬──────────┬──────────┬─────────────────────────────────────────────────────────────────────┐
│ Minor Release Update                   │ Version  │ Latest   │                                                                     │
├────────────────────────────────────────┼──────────┼──────────┼─────────────────────────────────────────────────────────────────────┤
│ aiosqlite                              │ 0.18.0   │ 0.19.0   │ https://pypi.python.org/pypi/aiosqlite                              │
│ alembic                                │ 1.10.3   │ 1.11.1   │ https://pypi.python.org/pypi/alembic                                │
└────────────────────────────────────────┴──────────┴──────────┴─────────────────────────────────────────────────────────────────────┘

┌──────────────────────────────┬─────────────┬─────────────┬───────────────────────────────────────────────────────────┐
│ Unchanged Packages           │ Version     │ Latest      │                                                           │
├──────────────────────────────┼─────────────┼─────────────┼───────────────────────────────────────────────────────────┤
│ ansi2html                    │ 1.8.0       │ 1.8.0       │ https://pypi.python.org/pypi/ansi2html                    │
│ appnope                      │ 0.1.3       │ 0.1.3       │ https://pypi.python.org/pypi/appnope                      │
└──────────────────────────────┴─────────────┴─────────────┴───────────────────────────────────────────────────────────┘

旧的:pip search已被弃用

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

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

运行时错误:PyPI不再支持'pip search'(或XML-RPC搜索)。请改用https://pypi.org/search(通过浏览器)进行搜索。有关更多信息,请参阅https://warehouse.pypa.io/api-reference/xml-rpc.html#deprecated-methods。 - Dominick
谢谢。很明显pip search已经被弃用了。已更新答案。 - Rico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接