Обновление всех пакетов с помощью pip
можно ли обновить все пакеты Python за один раз с помощью pip
?
обратите внимание, что есть запрос функции для этого на официальном баг-трекере.
30 ответов:
еще нет встроенного флага, но вы можете использовать
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
The
grep
это пропустить редактируемые ("- e") определения пакетов, как предложено @jawache. (Да, вы могли бы заменитьgrep
+cut
Сsed
илиawk
илиperl
или...).The
-n1
флагxargs
предотвращает остановку всего, если обновление одного пакета не удается (спасибо @andsens).
вы можете использовать следующий код на Python. В отличие от
pip freeze
, это не будет печатать предупреждения и FIXME ошибки. для pipimport 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-review
это вилкаpip-tools
. Смотритеpip-tools
вопрос упомянутые @knedlsepp.pip-review
пакет работает, но больше не работает.
pip-review
работает на Windows начиная с версии 0.5.
работает на Windows. Должно быть хорошо и для других тоже. ($- это любой каталог, в котором вы находитесь, в командной строке. например. C:/Users/Username>)
do
$ 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
Роб ван дер Водэfor /F "delims===" %i in ('pip freeze -l') do pip install -U %i
вы можете просто распечатать пакеты, которые устарели
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
следующий однострочный может оказаться полезным:
pip list --format legacy --outdated | sed 's/(.*//g' | xargs -n1 pip install -U
xargs -n1
продолжает работать, если возникает ошибка.Если вам нужен более "мелкозернистый" контроль над тем, что опущено, и что вызывает ошибку, вы не должны добавлять
-n1
флаг и явно определить ошибки, чтобы игнорировать, "конвейер" следующую строку для каждой отдельной ошибки:
| sed 's/^<First characters of the error>.*//'
вот пример:
pip list --format legacy --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 | awk '{ print }'`
(
awk '{ print }'
выбирает первое слово строки (разделенное пробелом))и эта версия позволяет подавлять предупреждающее сообщение от
pip list --outdated
:pip install -U `pip list --outdated | awk '!/Could not|ignored/ { print }'`
(
awk '!/<pattern>/'
удаляет строку, содержащую заданный узор. В моем случае предупреждающие сообщения включают "не удалось" и "проигнорировано" соответственно)это также может быть использовано для решения предстоящего дефолта
columns
формат:pip install -U `pip list --format=columns --outdated | awk '!/Package|---/{ print }'`
это кажется более лаконичным.
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
от https://github.com/cakebread/yolk:
$ pip install -U `yolk -U | awk '{print }' | uniq`
однако сначала вам нужно получить желток:
$ sudo pip install -U yolk
Более Надежное Решение
для pip3 используйте это:
pip3 freeze --local |sed -rn 's/^([^=# \t\][^ \t=]*)=.*/echo; echo Processing ...; pip3 install -U /p' |sh
для pip, просто удалите 3s как таковые:
pip freeze --local |sed -rn 's/^([^=# \t\][^ \t=]*)=.*/echo; echo Processing ...; pip install -U /p' |sh
OSX странность
OSX, по состоянию на июль 2017 года, поставляется с очень старой версией sed (десять лет). Чтобы получить расширенные регулярные выражения, используйте -E вместо-r в решении выше.
решение проблем с популярными решениями
Это решение хорошо разработана и проверено1, тогда как есть проблемы даже с самыми популярными решениями.
- проблемы с переносимостью из-за изменения функций командной строки pip
- авария команды xargs, потому что общие pip или pip3 технологических нарушений ребенка
- переполненный журнал с выхода raw xargs
- полагаясь на языке Python для операционной системы мост пока потенциально модернизацию3
приведенная выше команда использует самый простой и самый портативный синтаксис pip в сочетании с sed и sh, чтобы полностью преодолеть эти проблемы. Детали операции sed можно изучить с помощью комментируемой версии2.
подробности
[1] протестирована и регулярно используется в Linux 4.8.16-200.fc24.кластер x86_64 и протестирован на пяти других вариантах Linux/Unix. Он также работает на Cygwin64 установлен на Windows 10. Тестирование на 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 ..." # perform the upgrade using just the valid package name sed="$sed; pip3 install -U " # 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, может быть потенциальной причиной взаимоблокировки или повреждения базы данных пакета.
однострочная версия @ответ Раманы.
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
'
у меня была такая же проблема с обновлением. Дело в том, что я никогда не обновляю все пакеты. Я обновляю только то, что мне нужно, потому что проект может сломаться.
потому что не было простого способа обновления пакета за пакетом и обновления требований.txt файл, я написал это pip-upgrader, который также обновляет версии в вашем
requirements.txt
file для выбранных пакетов (или всех пакеты.)установка
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 и если вы просто хотите обновить пакеты добавил для вашего virtualenv, вы можете сделать:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
вы можете попробовать это :
for i in ` pip list|awk -F ' ' '{print }'`;do pip install --upgrade $i;done
самое простое и быстрое решение, которое я нашел в обсуждение вопроса pip - это:
sudo -H pip install pipdate sudo -H pipdate
довольно удивительный желток делает это легко.
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
Он может делать много вещей, которые вы, вероятно, найдете полезными.
отправлено через pull-запрос к народу 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 " "}')
Я
printf
с пробелом после этого, чтобы правильно разделить имена пакетов.
@Раманы!--5--> работали лучше для меня, из тех, кто здесь, но мне пришлось добавить несколько зацепок:
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
The
site-packages
проверка исключает мои пакеты разработки, поскольку они не находятся в системном каталоге site-packages. Попытка-за исключением просто пропускает пакеты, которые были удалены из PyPI.@endolith: я надеялся на простой
pip.install(dist.key, upgrade=True)
тоже, но не похоже, что pip должен был использоваться чем-либо, кроме командной строки (документы не упоминайте внутренний API, и разработчики pip не использовали docstrings).
разве это не эффективно?
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 аргумент из канала слева от него и передает его команде для обновления списка пакетов.
вот мой вариант ответа rbp, который обходит "редактируемые" и дистрибутивы разработки. Он разделяет два недостатка оригинала: он повторно загружает и переустанавливает без необходимости; и ошибка на одном пакете предотвратит обновление каждого пакета после этого.
pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --
связанные сообщения об ошибках, немного разрозненные после миграции из оба:
Я пробовал код Ramana и я узнал, что на Ubuntu вы должны написать
sudo
для каждой команды. Вот мой скрипт, который отлично работает на ubuntu 13.10:#!/usr/bin/env python import pip from subprocess import call for dist in pip.get_installed_distributions(): call("sudo pip install --upgrade " + dist.project_name, shell=True)
вот еще один способ сделать со скриптом на Python
import pip, tempfile, contextlib with tempfile.TemporaryFile('w+') as temp: with contextlib.redirect_stdout(temp): pip.main(['list','-o']) temp.seek(0) for line in temp: pk = line.split()[0] print('--> updating',pk,'<--') pip.main(['install','-U',pk])
вот скрипты, которые обновляют только устаревшие пакеты.
import os, sys from subprocess import check_output, call file = check_output(["pip.exe", "list", "--outdated", "--format=legacy"]) line = str(file).split() for distro in line[::6]: call("pip install --upgrade " + distro, shell=True)
Я использую полиуретан в последнее время. Это просто и по существу. Он обновляет ваш
requirements.txt
файл, чтобы отразить обновления, и вы можете обновить его с помощью как обычно.$ pip install pur ... Successfully installed pur-4.0.1 $ pur Updated boto3: 1.4.2 -> 1.4.4 Updated Django: 1.10.4 -> 1.10.5 Updated django-bootstrap3: 7.1.0 -> 8.1.0 All requirements up-to-date. $ pip install --upgrade -r requirements.txt Successfully installed Django-1.10.5 ...
Comments