提问人:thedjpetersen 提问时间:4/27/2010 最后编辑:Peter Mortensenthedjpetersen 更新时间:9/5/2023 访问量:1803993
如何使用 pip 升级所有 Python 包
How to upgrade all Python packages with pip
答:
目前还没有内置标志。从 pip 版本 22.3 开始,和 变得互斥。使用 Python 解析 JSON 输出:--outdated
--format=freeze
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
这是跳过可编辑的 (“-e”) 包定义,如 @jawache 所建议的那样。(是的,您可以将 + 替换为 or 或 or...)。
grep
grep
cut
sed
awk
perl
如果更新一个包失败,则防止停止所有内容的标志(感谢@andsens)。
-n1
xargs
注意:这有无限的潜在变化。我试图保持这个答案简短明了,但请在评论中提出一些变化!
评论
pip install -U
tee
pip freeze --local | tee before_upgrade.txt | ...
-H
sudo
$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
您可以使用以下 Python 代码。与 不同,这不会打印警告和 FIXME 错误。对于 pip < 10.0.1pip freeze
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)
评论
import pip
pip.install('packagename')
您可以只打印过时的包:
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
评论
pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
python -m pip list outdated
python -m pip list --outdated
使用 virtualenv 时,如果您只想升级添加到 virtualenv 中的软件包,您可能需要执行以下操作:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
在查阅了 Rob van der Woude 的 FOR
优秀文档后,Windows 版本:
for /F "delims===" %i in ('pip freeze') do pip install --upgrade %i
评论
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i
更快,因为它只会尝试更新“过时”的软件包
for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i
%%i
%i
pip
python -m pip install --upgrade pip
从蛋黄:
pip install -U `yolk -U | awk '{print $1}' | uniq`
但是,您需要先获得蛋黄:
sudo pip install -U yolk
评论
在座的那些人中,拉马纳的回答对我来说效果最好,但我不得不补充一些问题:
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 中删除的包。site-packages
致 endolith:我也希望有一个简单的,但看起来 pip 除了命令行之外并不打算被任何东西使用(文档没有提到内部 API,pip 开发人员也没有使用文档字符串)。pip.install(dist.key, upgrade=True)
评论
pip
/usr/local/lib/python2.7/dist-packages
if
要升级所有本地软件包,您可以安装 pip-review
:
$ pip install pip-review
之后,您可以以交互方式升级软件包:
$ pip-review --local --interactive
或自动:
$ pip-review --local --auto
pip-review
是 的分支。请参阅 @knedlsepp 提到的 pip-tools
问题。 软件包有效,但软件包不再有效。pip-review
正在寻找新的维护者。pip-tools
pip-review
pip-tools
pip-review
自 0.5 版起适用于 Windows。
评论
pip-review --local --auto
拉马纳回答的单行版本。
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
评论
您可以尝试以下操作:
for i in `pip list | awk -F ' ' '{print $1}'`; do pip install --upgrade $i; done
评论
通过拉取请求发送给 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
评论
get_installed_distributions
以下单行代码可能会有所帮助:
(点 >= 22.3)
根据这个可读的答案:
pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`
或根据接受的答案:
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
(点 20.0 < 22.3)
pip list --format freeze --outdated | sed 's/=.*//g' | xargs -n1 pip install -U
旧版本:
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
评论
| sed 's/^<First characters of the error>.*//'
pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 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
pip list -o
列出过时的软件包;grep -v -i warning
反转匹配,避免更新时出错warning
cut -f1 -d1' '
返回第一个单词 - 过时包的名称;tr "\n|\r" " "
将多行结果转换为单行空格分隔的列表;cut
awk '{if(NR>=3)print}'
跳过标题行cut -d' ' -f1
获取第一列xargs -n1 pip install -U
从其左侧的管道中获取 1 个参数,并将其传递给命令以升级软件包列表。
评论
kerberos iwlib PyYAML Could pygpgme Could Could Could ...
pip list -o
# pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ")
xargs
pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -U
-r
pip install -U
-p
-n1
在我看来,这个选项更直接、更易读:
pip install -U `pip list --outdated | awk 'NR>2 {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
在 AWK 命令中,跳过前两条记录(行)并选择每行的第一个单词(正如 SergioAraujo 所建议的那样,我删除了,因为确实可以处理跳过记录)。NR>2
{print $1}
tail -n +3
awk
评论
| xargs -n1
以下内容适用于 Windows,也应该对其他人有好处( 是您在命令提示符下所在的任何目录。例如,C:/Users/Username)。$
做
$ pip freeze > requirements.txt
打开文本文件,将 替换为 ,或者让 sed 为您执行操作:==
>=
$ sed -i 's/==/>=/g' 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”来升级所有软件包;如果一次升级失败,请再次运行它,并在下一次升级时继续。
评论
requirements.txt
=={version}
python-dateutil==2.4.2
python-dateutil
$ pip freeze | cut -d '=' -f1> requirements.txt
pip3 install -r <(pip3 freeze) --upgrade
<(pip3 freeze)
相当神奇的蛋黄使这变得容易。
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
它可以做很多你可能会觉得有用的事情。
这似乎更简洁。
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
将传递给每个命令的参数数限制为 1。pip install -U
评论
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Windows PowerShell 解决方案
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
评论
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}
?
pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
pip list --outdated --format freeze..
pip list
pip freeze
--format freeze
pip list
pip freeze
更强大的解决方案
对于 pip3,请使用以下命令:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
对于 pip,只需删除 3 即可:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OS X 奇异
截至 2017 年 7 月,OS X 附带了一个非常旧版本的 sed(已有十几年的历史)。要获取扩展的正则表达式,请在上面的解决方案中使用 INSTEAD。-E
-r
使用流行的解决方案解决问题
该解决方案经过精心设计和测试1,而即使是最流行的解决方案也存在问题。
- 由于更改 pip 命令行功能导致的可移植性问题
- 由于常见的 pip 或 pip3 子进程失败而导致 xargs 崩溃
- 来自原始 xargs 输出的拥挤日志记录
- 依赖 Python 到 OS 的桥接,同时可能对其进行升级3
上面的命令使用最简单、最可移植的 pip 语法与 sed 和 sh 相结合,以完全克服这些问题。可以使用注释版本2 仔细检查 sed 操作的细节。
详
[1] 在 Linux 4.8.16-200.fc24.x86_64 集群中测试并定期使用,并在其他五种 Linux/Unix 版本上进行了测试。它还可以在 Windows 64 上安装的 Cygwin10 上运行。需要在 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 组件)可能会导致死锁或包数据库损坏。
评论
sed
gsed
brew install gnu-sed
我在升级时遇到了同样的问题。问题是,我从不升级所有软件包。我只升级我需要的东西,因为项目可能会中断。
因为没有简单的方法来逐个包升级和更新需求 .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
完全披露:我写了这个包。
评论
virtualenv
pip-upgrade --skip-virtualenv-check
我在 pip 问题讨论中发现的最简单、最快的解决方案是:
pip install pipdate
pipdate
来源:https://github.com/pypa/pip/issues/3819
评论
用:
pip install -r <(pip freeze) --upgrade
使用 AWK 更新包:
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
Windows PowerShell 更新
foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
评论
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
评论
Windows 上最短、最简单的。
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
评论
PowerShell 5.1 中具有管理员权限、Python 3.6.5 和 pip 版本 10.0.1 的一行:
pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}
如果列表中没有破损的包装或特殊轮子,它可以顺利运行......
评论
[0]
如果您已经安装了纯 Bash/Z shell 单行代码来实现这一点:pip<22.3
for p in $(pip list -o --format freeze); do pip install -U ${p%%=*}; done
或者,以一种格式合理的方式:
for p in $(pip list -o --format freeze)
do
pip install -U ${p%%=*}
done
在此之后,您将拥有其中和相互排斥,并且您不能再使用此单行。pip>=22.3
-o
--format freeze
评论
for p in $(pip list -o --format freeze); do echo "${p} -> ${p%%=*}"; done
${haystack%%needle}
delete longest match of needle from back of haystack
使用 pipupgrade!...2019 年最新版本
pip install pipupgrade
pipupgrade --verbose --latest --yes
pipupgrade 帮助您从文件升级系统、本地或软件包!它还会选择性地升级不会中断更改的软件包。requirements.txt
pipupgrade 还确保升级多个 Python 环境中存在的包。它与 Python 2.7+、Python 3.4+ 和 pip 9+、pip 10+、pip 18+、pip 19+ 兼容。
注意:我是该工具的作者。
评论
Checking...
~/.cache/pip
~/Library/Caches/pip
ModuleNotFoundError: No module named 'ctypes.windll'
在 Windows 或 Linux 上更新 Python 包
将已安装软件包的列表输出到需求文件 (requirements: .txt):
pip freeze > requirements.txt
编辑 requirements.txt,并将所有 '==' 替换为 '>='。使用编辑器中的“全部替换”命令。
升级所有过时的软件包
pip install -r requirements.txt --upgrade
来源: 如何更新所有 Python 包
评论
pip freeze > requirements.txt
pip freeze | sed 's/==/>=/' > requirements.txt
自动交换。==
>=
没有必要那么麻烦或安装一些软件包。
在 Linux shell 上更新 pip 包:
pip list --outdated --format=freeze | awk -F"==" '{print $1}' | xargs -i pip install -U {}
在 Windows PowerShell 上更新 pip 包:
pip list --outdated --format=freeze | ForEach { pip install -U $_.split("==")[0] }
几点:
- 将 python 版本替换为 或 。
pip
pip3
pip2
pip list --outdated
检查过时的 pip 包。--format
在我的 pip 版本 22.0.3 上只有 3 种类型:列(默认)、freeze 或 json。 在命令管道中是更好的选择。freeze
- 尽可能多地保持命令简单和可用。
评论
ERROR: List format 'freeze' cannot be used with the --outdated option.
评论
pip freeze
bundle install
npm shrinkwrap
pip list --format freeze | %{pip install --upgrade $_.split('==')[0]}