如何使用pip升级所有Python软件包?

本文探讨了如何使用pip和第三方工具pipupgrade来批量升级Python环境中所有软件包的方法。从讨论中可以看到,尽管pip本身不提供一键升级功能,但可以通过一些命令行技巧或使用pipupgrade工具实现这一目标。
摘要由CSDN通过智能技术生成

是否可以通过pip一次升级所有Python软件包?

注意 :官方问题追踪器上对此功能有要求


#1楼

https://github.com/cakebread/yolk

$ pip install -U `yolk -U | awk '{print $1}' | uniq`

但是,您需要先获得蛋黄:

$ sudo pip install -U yolk

#2楼

@Ramana的答案对我来说最有效,但是我不得不添加一些注意事项:

import pip
for dist in pip.get_installed_distributions():
    if 'site-packages' in dist.location:
        try:
            pip.call_subprocess(['pip', 'install', '-U', dist.key])
        except Exception, exc:
            print exc

site-packages检查不包括我的开发软件包,因为它们不在系统站点软件包目录中。 try-except仅跳过已从PyPI中删除的软件包。

@endolith:我也希望有一个简单的pip.install(dist.key, upgrade=True) ,但它看起来不像pip可以被命令行以外的任何方式使用(文档中没有提到内部API,并且pip开发人员未使用文档字符串)。


#3楼

升级所有本地软件包; 您可以使用pip-review

$ pip install pip-review
$ pip-review --local --interactive

pip-reviewpip-tools一个分支。 请参阅@knedlsepp提到的pip-tools问题pip-review软件包有效,但pip-tools软件包不再有效。

从0.5版开始, pip-review在Windows上运行。


#4楼

@Ramana的答案的一线版。

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

`


#5楼

您可以尝试以下方法:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done

#6楼

通过拉动请求发送给小学生 。 同时使用此pip库解决方案,我写道:

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted

#7楼

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

pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

如果出现错误, xargs -n1继续运行。

如果您需要对遗漏的内容和引起错误的内容进行更多的“细粒度”控制,则不应添加-n1标志并显式定义要忽略的错误,方法是为每个单独的错误“插入”以下行:

| sed 's/^<First characters of the error>.*//'

这是一个工作示例:

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

#8楼

这不是更有效吗?

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -o列出过时的软件包;
  2. grep -v -i warningwarning进行反向匹配,以避免更新时出错
  3. cut -f1 -d1' '返回第一个单词-过时软件包的名称;
  4. tr "\\n|\\r" " "cut的多行结果转换为单行,以空格分隔的列表;
  5. awk '{if(NR>=3)print}'跳过标题行
  6. cut -d' ' -f1获取第一列
  7. xargs -n1 pip install -U从左管道中获取1个参数,并将其传递给命令以升级软件包列表。

#9楼

在我看来,这个选项更直接易读:

pip install -U `pip list --outdated | tail -n +3 | awk '{print $1}'`

解释是pip list --outdated以这种格式输出所有过时软件包的列表:

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

tail -n +3跳过前两行,而awk '{print $1}'选择每行的第一个单词。


#10楼

这似乎对我有用...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

之后,我在printf加上了一个空格,以正确分隔软件包名称。


#11楼

适用于Windows。 也应该对别人有好处。 ($是您在命令提示符下所在的目录,例如C:/ Users / Username>)

$ pip freeze > requirements.txt

打开文本文件,将==替换为>= ,然后执行

$ pip install -r requirements.txt --upgrade

如果您对某个软件包停止升级有问题(有时为numpy),只需转到目录($),注释掉名称(在其前面添加#),然后再次运行升级。 您稍后可以取消对该部分的注释。 这对于复制python全局环境也非常有用。


其他方式:

我也喜欢pip-review方法:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

您可以选择“ a”来升级所有软件包。 如果一次升级失败,请再次运行它,然后继续进行下一次升级。


#12楼

还没有内置标志,但是您可以使用

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将跳过@jawache建议的可编辑(“ -e”)软件包定义。 (是的,您可以将grep + cut替换为sedawkperl或...)。

如果更新一个软件包失败(感谢@andsens ),则xargs-n1标志可阻止停止所有操作。


#13楼

相当惊人的蛋黄使这一过程变得容易。

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

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


#14楼

这似乎更简洁。

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

说明:

pip list --outdated获取这样的行

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

cut -d ' ' -f1-d ' '将“ space”设置为定界符, -f1表示获取第一列。

因此,以上几行变为:

urllib3
wheel

然后将它们传递给xargs以运行命令pip install -U ,每行都作为附加参数

-n1将传递给每个命令pip install -U的参数数量限制为1


#15楼

Windows Powershell解决方案

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}

#16楼

我的剧本:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade

#17楼

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)

可以快速运行,因为它不会不断启动外壳。 我希望找到时间使用过时的列表实际完成此操作,以进一步加快速度。


#18楼

更强大的解决方案

对于pip3,请使用以下命令:

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

对于点子,只需将3删除即可:

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

OSX奇数

截至2017年7月,OSX随附了非常老版本的sed(已有十二年历史)。 要获取扩展的正则表达式,请在上述解决方案中使用-E而不是-r。

用流行的解决方案解决问题

该解决方案经过精心设计和测试1 ,而即使是最流行的解决方案也存在问题。

  • 由于更改pip命令行功能而导致的可移植性问题
  • 由于常见的pip或pip3子进程失败而导致xargs崩溃
  • 来自原始xargs输出的拥挤日志
  • 依靠Python到OS的网桥,同时可能对其进行升级3

上面的命令结合使用sed和sh来使用最简单,最可移植的pip语法来完全解决这些问题。 sed操作的详细信息可以通过注释的版本2进行审查。


细节

[1]经过测试,并在Linux 4.8.16-200.fc24.x86_64群集中正常使用,并在其他五种Linux / Unix版本上进行了测试。 它还可以在Windows 10上安装的Cygwin64上运行。需要在iOS上进行测试。

[2]为了更清楚地了解命令的结构,这与上面带有注释的pip3命令完全等效:

# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"

# separate the output of package upgrades with a blank line
sed="$sed/echo"

# indicate what package is being processed
sed="$sed; echo Processing \1 ..."

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"

# output the commands
sed="$sed/p"

# stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local |sed -rn "$sed" |sh

[3]升级还用于升级Python或PIP组件的Python或PIP组件可能是导致死锁或软件包数据库损坏的潜在原因。


#19楼

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

因为没有简便的方法可以逐个软件包升级软件包并更新requirements.txt文件,所以我写了这个pip-upgrader ,它为所选软件包(或所有软件包) 更新了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参数。

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


#20楼

这是针对Python 3的PowerShell解决方案:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

对于Python 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

这将一个接一个地升级软件包。 所以

pip3 check
pip2 check

之后应确保没有依赖项被破坏。


#21楼

点子问题讨论中找到的最简单,最快的解决方案是:

sudo -H pip install pipdate
sudo -H pipdate

来源: https//github.com/pypa/pip/issues/3819


#22楼

怎么样:

pip install -r <(pip freeze) --upgrade

#23楼

使用awk更新包: pip install -U $(pip freeze | awk -F'[=]' '{print $1}') Frozen pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

Windows Powershell更新foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}


#24楼

pip_upgrade_outdated完成了这项工作。 根据其文档

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

第1步:

pip install pip-upgrade-outdated

第2步:

pip_upgrade_outdated

#25楼

在Windows上最短,最简单。

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt

#26楼

使用pipupgrade

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

pipupgrade可帮助您从requirements.txt文件升级系统,本地或软件包! 它还有选择地升级不会破坏更改的软件包。 pipupgrade还确保升级存在于多个Python环境中的软件包。 与Python2.7 +,Python3.4 +和pip9 +,pip10 +,pip18 +,pip19 +兼容。

在此处输入图片说明

注意:我是该工具的作者。


#27楼

您可以使用以下Python代码。 与pip freeze不同,这不会打印警告和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)

对于点> = 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)

#28楼

您可以只打印过时的软件包

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

#29楼

使用virtualenv时,如果您只想升级添加到virtualenv中的软件包,则可能需要执行以下操作:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade

#30楼

Windows版本,查阅了Rob的出色的FOR 文档之后

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值