是否可以一次升级所有Python包装 pip?

笔记: : 这就是了 功能请求 为此,在官方发行跟踪器上。

有帮助吗?

解决方案

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

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+cutsed 或者 awk 或者 perl 或者...)。

-n1 标志 xargs 如果更新一个软件包失败,可以防止停止所有内容(谢谢 @andsens).

其他提示

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

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

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

pip-reviewpip-tools. 。看 pip-tools 问题 提到 @knedlsepp. pip-review 包装有效,但是 pip-tools 软件包不再起作用。

pip-review 在Windows上工作 由于版本为0.5.

在Windows上工作。也应该对别人有好处。 ($是您使用的任何目录,在命令提示符中。

$ 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”来升级所有软件包;如果一个升级失败,请再次运行,然后在下一个升级。

咨询出色后的Windows版本 文档 为了 FOR 作者Rob van der Woude

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

采用 pipupgrade!

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

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

enter image description here

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

您只能打印过时的软件包

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

以下单线可能会得到帮助:

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

在我看来,这个选项似乎更简单和可读性:

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}' 选择每行的第一个单词。

更健壮的解决方案

用于pip3使用以下方式:

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

对于PIP,只需删除3s:

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

OSX奇数

OSX,截至2017年7月,SED(十几岁)的旧版本。要获得扩展的正则表达式,请在上面的解决方案中使用-e而不是-r。

通过流行解决方案解决问题

该解决方案的设计和测试良好1, ,尽管最受欢迎的解决方案也存在问题。

  • 由于更改PIP命令行特征而引起的可移植性问题
  • XARG崩溃,因为普通PIP或PIP3子进程失败
  • 从RAW XARGS输出中登录拥挤的日志
  • 依靠Python到OS桥,同时升级它3

上面的命令将最简单,最便携的PIP语法与SED和SH结合使用,以完全克服这些问题。 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组件可能是导致死锁或软件包数据库损坏的潜在原因。

这似乎更简洁。

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 ' ' 将“空间”设置为定界符, -f1 意味着获取第一列。

因此上述行变为:

urllib3
wheel

然后传递给 xargs 要运行命令, pip install -U, ,每行作为附加参数

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

升级我也有同样的问题。事实是,我从不升级所有软件包。我只升级所需的东西,因为项目可能会破裂。

因为没有简单的方法可以通过包装升级软件包并更新要求。TXT文件,我写了 PIP-UPLADER 哪一个 还会更新您的版本 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 请您的命令。

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

https://github.com/cakebread/yolk :

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

但是,您需要先让蛋黄:

$ sudo pip install -U yolk

一线版本的 @Ramana的答案.

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

`

使用Virtualenv时,如果您只想升级软件包 添加 对于您的Virtualenv,您可能想做:

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

Windows PowerShell解决方案

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

我在 PIP问题讨论 是:

sudo -H pip install pipdate
sudo -H pipdate

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

您可以尝试一下:

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

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

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

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

使用Awk Update Packges: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

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

@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), ,但看起来除了命令行以外的任何其他内容(文档都没有提及内部API,PIP开发人员没有使用DocStrings)。

发送 对PIP民间的撤退;同时,使用此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

这似乎对我有用...

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

我用了 printf 之后有一个空间,可以正确分开包装名称。

窗户上最短,最简单。

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

我的脚本:

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

这不是更有效吗?

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 warning 倒比赛 warning 更新时避免错误
  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个参数,然后将其传递到命令以升级软件包列表。

这是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

之后应确保没有依赖性被打破。

怎么样:

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

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
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)

工作很快,因为它不会不断启动外壳。我很想找到时间实际使用过时的列表来更快地加快此事的时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top