是否可以使用pip一次性升级所有Python包?

注意:官方问题跟踪器上对此有一个功能请求。


当前回答

使用pipupgrade。。。最新版本2019

$ pip install pipupgrade
$ pipupgrade --verbose --latest --yes

pipupgrade帮助您从requirements.txt文件升级系统、本地或软件包!它还选择性地升级不破坏更改的包。

pipupgrade还确保升级多个Python环境中的包。它与Python2.7+、Python23.4+和pip9+、pip10+、pip18+、pip19+兼容。

注:我是该工具的作者。

其他回答

在查阅Rob van der Woude的for优秀文档后,Windows版本:

for /F "delims===" %i in ('pip freeze') do pip install --upgrade %i

我在升级方面也遇到了同样的问题。问题是,我从不升级所有包。我只升级我需要的,因为项目可能会中断。

因为没有一种简单的方法来逐个包升级和更新requirements.txt文件,所以我编写了这个pip升级程序,它还更新了所选包(或所有包)的requirements.txt文件中的版本。

安装

pip install pip-upgrader

用法

激活virtualenv(这很重要,因为它还将在当前virtualenv中安装升级包的新版本)。

cd到项目目录中,然后运行:

pip-upgrade

高级用法

如果需求放置在非标准位置,请将其作为参数发送:

pip-upgrade path/to/requirements.txt

如果您已经知道要升级的软件包,只需将其作为参数发送:

pip-upgrade -p django -p celery -p dateutil

如果需要升级到发布前/发布后版本,请在命令中添加--prerelease参数。

完全披露:我写了这个包裹。

查看所有过时的软件包

 pip list --outdated --format=columns

安装

 sudo pip install pipdate

然后键入

 sudo -H pipdate

还没有内置标志。从pip版本22.3开始,--过时和--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)]))"

如果您正在使用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标志防止在更新一个包失败时停止所有操作(谢谢@andss)。


注意:这有无限的潜在变化。我试图让这个答案简短明了,但请在评论中提出建议!

在Windows或Linux上更新Python包

1-将已安装软件包的列表输出到需求文件(requirements.txt)中:

pip freeze > requirements.txt

2-编辑requirements.txt,并将所有“==”替换为“>=”。在编辑器中使用“全部替换”命令。

3-升级所有过时的软件包

pip install -r requirements.txt --upgrade

资料来源:https://www.activestate.com/resources/quick-reads/how-to-update-all-python-packages/