如何用pip升级所有Python包

2783 投票
62 回答
1861153 浏览
提问于 2025-04-15 22:04

可以用pip一次性升级所有的Python包吗?

注意:在官方问题追踪器上,有人提出了这个功能的请求

62 个回答

840

你可以使用下面的Python代码。跟pip freeze不一样,这段代码不会打印出警告和需要修复的错误信息。

对于pip版本小于10.0.1

import pip
from subprocess import call

packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), shell=True)

对于pip版本大于等于10.0.1

import pkg_resources
from subprocess import call

packages = [dist.project_name for dist in pkg_resources.working_set]
call("pip install --upgrade " + ' '.join(packages), shell=True)
899

要升级所有本地的包,你可以先安装一个叫做 pip-review 的工具:

$ pip install pip-review

安装完成后,你可以选择交互式地升级这些包,也就是一步一步来:

$ pip-review --local --interactive

或者你也可以选择自动升级,这样就会一次性把所有包都升级了:

$ pip-review --local --auto

pip-reviewpip-tools 的一个分支。具体情况可以查看 pip-tools 的问题,这个问题是由 @knedlsepp 提到的。现在 pip-review 这个工具可以正常使用,但 pip-tools 已经不能用了。pip-review 目前正在寻找新的维护者。

pip-review 在 Windows 系统上从 0.5 版本开始 就可以使用了。

2871

目前还没有内置的标志。从pip版本22.3开始,--outdated--format=freeze这两个选项不能同时使用。你可以用Python来解析JSON输出:

pip --disable-pip-version-check list --outdated --format=json | python -c "import json, sys; print('\n'.join([x['name'] for x in json.load(sys.stdin)]))" | xargs -n1 pip install -U

如果你使用的是pip<22.3,你可以使用:

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

对于旧版本的pip

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

  • 这里的grep是用来跳过可编辑的("-e")包定义的,正如@jawache所建议的那样。(没错,你可以用sedawkperl等替代grepcut。)

  • xargs-n1选项可以防止在更新一个包失败时,整个过程都停止(感谢@andsens)。


注意:这个方法有无数种可能的变体。我尽量让这个回答简短易懂,但欢迎在评论中提出其他变体建议!

撰写回答