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-review
是 pip-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所建议的那样。(没错,你可以用sed
、awk
、perl
等替代grep
和cut
。)xargs
的-n1
选项可以防止在更新一个包失败时,整个过程都停止(感谢@andsens)。
注意:这个方法有无数种可能的变体。我尽量让这个回答简短易懂,但欢迎在评论中提出其他变体建议!