pip
升级时会搞砸安装requests
。错误消息是cannot import name IncompleteRead
。
pip
升级时会搞砸安装requests
。错误消息是cannot import name IncompleteRead
。
Answers:
还没有内置标志,但是您可以使用
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
为sed
or awk
或perl
or or ...)。
该-n1
标志用于xargs
防止在更新一个软件包失败时停止所有操作(感谢@andsens)。
pip install -U
,它将更新所有软件包。恐怕会与apt-get产生一些冲突。
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代码。与不同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)
import pip
pip.install('packagename')
什么?
升级所有本地软件包;您可以使用pip-review
:
$ pip install pip-review
$ pip-review --local --interactive
pip-review
是的叉子pip-tools
。见pip-tools
问题被提到@knedlsepp。pip-review
包有效,但pip-tools
包不再有效。
pip-review
从0.5版开始在Windows上运行。
pip-review --local --auto
适用于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”来升级所有软件包。如果一次升级失败,请再次运行它,然后继续进行下一次升级。
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)
是一个匿名管道,但是它将充当文件对象
咨询优良的售后服务Windows版本文档的FOR
罗布范德Woude
for /F "delims===" %i in ('pip freeze -l') do pip install -U %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 pipupgrade
$ pipupgrade --verbose --latest --yes
pipupgrade可帮助您从requirements.txt
文件升级系统,本地或软件包!它还有选择地升级不会破坏更改的软件包。pipupgrade还确保升级存在于多个Python环境中的软件包。与Python2.7 +,Python3.4 +和pip9 +,pip10 +,pip18 +,pip19 +兼容。
注意:我是该工具的作者。
Checking...
当我尝试它时,它会永远停滞不前。
[0;93mChecking...[0m
ModuleNotFoundError: No module named 'ctypes.windll'
您可以只打印过时的软件包
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
(尽管它不是需求格式)。
在我看来,此选项更直接易读:
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命令中,NR>2
跳过前两个记录(行)并{print $1}
选择每行的第一个单词(如SergioAraujo所建议,我删除了它,tail -n +3
因为awk
它确实可以处理跳过的记录)。
awk 'NR>2 {print $1}'
为您
以下一线可能会有所帮助:
(点> 20.0)
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,请使用以下命令:
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,而即使是最流行的解决方案也存在问题。
上面的命令结合使用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组件可能是导致死锁或软件包数据库损坏的潜在原因。
sed
OS X 的侏罗纪BSD 的另一种方法是改用gsed
(GNU sed)。要获得它,brew install gnu-sed
这似乎更简洁。
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
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.
我在升级时遇到了同样的问题。问题是,我从不升级所有软件包。我只升级我需要的东西,因为项目可能会中断。
因为没有简便的方法来逐个软件包升级软件包和更新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
请在命令中添加参数。
全面披露:我写了这个包裹。
virtualenv
未启用pip-upgrade --skip-virtualenv-check
从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()]'
`
使用awk更新包:
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
Windows Powershell更新
foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
您可以尝试以下方法:
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
它可以做很多您可能会发现有用的事情。
yolk
为yolk3k
,您的原始答案肯定与python3有关。
@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
检查不包括我的开发包,因为它们不在系统site-packages目录中。try-except仅跳过已从PyPI中删除的软件包。
@endolith:我也希望有一个简单的方法pip.install(dist.key, upgrade=True)
,但是它看起来不像pip应该被命令行以外的任何东西使用(文档没有提到内部API,并且pip开发人员没有使用文档字符串)。
pip
显然可以放入/usr/local/lib/python2.7/dist-packages
或类似的软件包。if
在这种情况下,可以在语句中使用“ / usr / local / lib /”而不是“ site-packages” 。
在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
通过拉动请求发送给小学生。同时使用此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
在Windows上最短,最简单。
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
这不是更有效吗?
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
“找不到符合要求<package>的下载内容”的输出
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" " ")
。否则,您很容易错过不需要的一行,并获得DrStrangeprk提到的结果。
xargs
改为使用。pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -U
该-r
标志确保pip install -U
在没有过期软件包的情况下不会运行。该-p
标志提示用户在执行任何命令之前进行确认。您可以添加-n1
标志,以使其在单独安装每个软件包之前提示您。
在Powershell 5.1中具有adm权限,python 3.6.5和pip ver 10.0.1的一行:
pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}
如果列表中没有破损的包装或特殊的轮子,它会正常工作...
pip freeze
(如bundle install
或npm shrinkwrap
)列出所有已安装软件包的确切版本。最好在修补之前保存该副本。