检查需求是否最新

82 投票
4 回答
24956 浏览
提问于 2025-04-18 01:54

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

6

新内容:

此外

$ 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:'
10

既然你提到喜欢遵循最佳实践,我猜你也在使用虚拟环境(virtualenv),对吧?假设是这样的话,既然你已经在锁定你的包了,有一个叫做pip-tools的工具可以在你的虚拟环境中运行,用来检查更新。

不过,这里有一个缺点,这也是我提到使用虚拟环境的原因。

这个工具会检查PyPI(Python包索引)并报告可用的更新。它使用当前安装的包列表来检查更新,而不是使用任何requirements.txt文件

如果你在虚拟环境中运行它,你可以很容易地看到哪些包有更新可用。但如果你不使用虚拟环境,最好不要在系统上运行这个工具,因为你的其他项目可能依赖于不同的版本(或者即使现在都能正常工作,更新后的版本也可能不兼容)。

根据提供的文档,使用起来很简单。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。同样,这个操作是针对当前活动的环境,所以建议在虚拟环境中使用。

你可以通过pip install pip-tools来安装这个项目。

作者的备注:我在小型Django项目中使用过这个工具,感觉非常不错。不过有一点,如果你在虚拟环境中安装了pip-tools,当你运行pip-dump时,它会被添加到你的requirements.txt文件中。因为我的项目比较小,我通常会手动删除那一行。如果你有某种构建脚本,可能需要在部署之前自动去掉它。

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

希望这对将来某些人有帮助。

137

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

这样就完成了。虽然这不是一个命令,但好处是你不需要任何外部依赖。

撰写回答