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

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


当前回答

相当惊人的蛋黄使这很容易。

pip install yolk3k # Don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

有关蛋黄的更多信息:https://pypi.python.org/pypi/yolk/0.4.3

它可以做很多你可能会发现有用的事情。

其他回答

如果你在macOS上,

确保已安装Homebrew安装jq以读取您将要生成的JSON

brew install jq

更新pip3列表生成的过时包列表中的每个项目--过时

pip3 install --upgrade  `pip3 list --outdated --format json | jq '.[] | .name' | awk -F'"' '{print $2}'`

Use:

import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
    pip.main(['install', '--upgrade', pkg])

甚至:

import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)

它的工作速度很快,因为它不会不断发射炮弹。

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

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

您可以使用以下Python代码。与pip冻结不同,这不会打印警告和FIXME错误。对于管道<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)

以下一行可能会有所帮助:

(点数>20.00)

pip list--格式冻结--过时|sed的/=.*//g'| xargs-n1 pip install-U

旧版本:pip list--格式冻结--过时|sed的/(.*//g'| xargs-n1 pip install-U

如果发生错误,xargs-n1将继续运行。

如果您需要对省略的内容和引发错误的内容进行更多的“细粒度”控制,则不应添加-n1标志并明确定义要忽略的错误,方法是为每个单独的错误“管道化”以下行:

|sed的/^<错误的第一个字符>.*//'

下面是一个工作示例:

pip list --format freeze --outdated | sed 's/=.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U