Возможно ли обновить все пакеты 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
должен пропускать редактируемые ("-e") определения пакетов, как это было предложено @jawache. (Да, вы могли бы заменить grep
+ cut
с помощью sed
или awk
или perl
или...).
Флаг -n1
для xargs
предотвращает остановку всего, если обновление одного пакета не выполняется (спасибо @andsens).
pip install -U
, он обновит все пакеты. Боюсь, это может вызвать конфликт с apt-get.
Вы можете использовать следующий код 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
является fork pip-tools
. См. pip-tools
issue, упомянутый @knedlsepp. pip-review
работает, но пакет pip-tools
больше не работает.
pip-review
работает с Windows с версии 0.5.
.py
в качестве обходного пути . Хотя есть и другие unixism, такие как вызов cat
, sort
в коде.
Работает в Windows. Должно быть хорошо и для других. ($ - любой каталог, в котором вы находитесь, в командной строке, например: C: /Users/Username>)
делать
$ pip freeze > requirements.txt
откройте текстовый файл, замените == на> =
затем сделайте
$ pip install -r requirements.txt --upgrade
Если у вас возникла проблема с определенным пакетом, останавливающим обновление (иногда с помощью numpy), просто перейдите в каталог ($), закомментируйте имя (добавьте # перед ним) и снова запустите обновление. Позднее вы можете раскомментировать этот раздел. Это также отлично подходит для копирования глобальных сред python.
Мне также нравится метод проверки пипса:
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
для всех строк.
Версия Windows после консультации с отличной документацией для FOR
by Rob van der 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
Быстрее, так как он будет пытаться только обновлять "устаревшие" пакеты
Вы можете просто распечатать устаревшие пакеты
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 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 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}'
выбирает первое слово каждой строки.
Это выглядит более кратким.
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.
Более надежное решение
Для 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 Oddity
OSX, по состоянию на июль 2017 года, поставляется с очень старой версией sed (дюжина лет). Чтобы получить расширенные регулярные выражения, используйте -E вместо -r в вышеприведенном решении.
Решение проблем с популярными решениями
Это решение хорошо спроектировано и протестировано 1 тогда как есть проблемы даже с самыми популярными решениями.
Приведенная выше команда использует простейший и самый переносимый синтаксис пипсов в сочетании с 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 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 - использовать gsed
(GNU sed). Чтобы получить его, brew install gnu-sed
Из https://github.com/cakebread/yolk:
$ pip install -U `yolk -U | awk '{print $1}' | uniq`
однако вам нужно сначала получить желток:
$ sudo pip install -U yolk
У меня была такая же проблема с обновлением. Дело в том, что я никогда не обновляю все пакеты. Я обновляю только то, что мне нужно, потому что проект может сломаться.
Поскольку не было простого способа обновления пакета за пакетом и обновления файла requirements.txt, я написал это pip-updrader, который также обновляет версии в вашем 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
в свою команду.
Полное раскрытие: я написал этот пакет.
Однострочный вариант ответа @Ramana.
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
'
sudo pip install
, используйте вместо этого виртуальную среду .
при использовании virtualenv, и если вы просто хотите обновить пакеты добавлены к вашему virtualenv, вы можете захотеть сделать:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
Решение Windows Powershell
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Самое простое и быстрое решение, которое я нашел в обсуждении проблемы с протоколом:
sudo -H pip install pipdate
sudo -H pipdate
Источник: https://github.com/pypa/pip/issues/3819
Удивительный желток делает это легко.
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
Это может сделать много вещей, которые вы, вероятно, найдете полезными.
Вы можете попробовать следующее:
for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
Ответ @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
помещает пакеты в /usr/local/lib/python2.7/dist-packages
или аналогичные. В этом случае вы можете использовать '/ usr / local / lib /' вместо 'site-packages' в операторе if
.
$ pip install pipupgrade
$ pipupgrade --latest --yes
pipupgrade поможет вам обновить вашу систему, локальные или пакеты из requirements.txt
файла! Он также выборочно обновляет пакеты, которые не нарушают изменения. Совместим с Python2. 7+, Python3. 4+ и pip9+, pip10+, pip18+.
ПРИМЕЧАНИЕ: я автор инструмента.
Checking...
навсегда, когда я попробовал.
Казалось, это сработало для меня...
pip install -U $(pip list --outdated|awk '{printf $1" "}')
Я использовал printf
с последующим пространством для правильного разделения имен пакетов.
Отправлено через запрос pull-to the pip folk; в то же время использовать это решение для библиотеки 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
используйте пакеты обновления awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
обновление Windows PowerShell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
Самый короткий и простой в Windows.
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
-r
не нужен и делает эту команду неудачной в Windows
Мой script:
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
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
принимает один аргумент из оставшегося от него канала и передает его команде для обновления списка пакетов.kerberos iwlib PyYAML Could pygpgme Could Could Could ...
Обратите внимание на все «Could». Они вытекают из вывода pip list -o
из "Не удалось найти загрузки, которые удовлетворяют требованию <пакет>"
pip list -o
?
одна строка в 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_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 version number and exit
Шаг 1:
pip install pip-upgrade-outdated
Шаг 2:
pip_upgrade_outdated
Как насчет:
pip install -r <(pip freeze) --upgrade
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)
Работает быстро, так как не постоянно запускает оболочку. Я хотел бы найти время, чтобы получить это на самом деле, используя список, устаревший, чтобы ускорить работу еще больше.
Вот сценарии, которые обновляют только устаревшие пакеты.
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)
Для новой версии pip, которая не выводится как устаревший формат (версия 18+).
import os, sys
from subprocess import check_output, call
file = check_output(["pip.exe", "list", "-o", "--format=json"])
line = str(file).split()
for distro in line[1::8]:
distro = str(distro).strip('"\",')
call("pip install --upgrade " + distro, shell=True)
Просмотреть устаревшие пакеты
pip list --outdated --format=columns
устанавливать
sudo pip install pipdate
затем введите
sudo -H pipdate
Это решение PowerShell для Python 3:
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
после этого следует убедиться, что никакие зависимости не сломаны.
Я использовал pur в последнее время. Это просто и точно. Он обновляет ваш файл requirements.txt
, чтобы отобразить обновления, и вы можете обновить его с помощью файла 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 ...
вот еще один способ сделать с script в 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])
Я пробовал код Ramana, и я узнал, что на Ubuntu вам нужно написать sudo
для каждой команды. Вот мой script, который отлично работает на 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)
Вот моя вариация на ответ rbp, которая обходит "редактируемые" и дистрибутивы развития. Он разделяет два недостатка оригинала: он повторно загружает и переустанавливает излишне; и ошибка на одном пакете будет препятствовать обновлению каждого пакета после этого.
pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --
Связанные отчеты об ошибках, немного не разделенные после миграции из битбакета:
Одна строка в cmd:
for /F "delims= " %i in ('pip list --outdated --format=legacy') do pip install -U %i
Таким образом,
pip check
после этого следует убедиться, что никакие зависимости не нарушены.
В качестве другого ответа здесь говорится:
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
Является возможным решением, Некоторые комментарии здесь, включая меня, имели проблемы с разрешениями при использовании этой команды. Небольшое изменение к следующему разрешило это для меня.
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Обратите внимание на добавленный sudo -H, который позволил команде ром с правами root.
sudo -H
) версию при обновлении пакетов для всей вашей системы.
И еще один способ: for pkg in $(pip list | cut -d' ' -f1); do sudo pip install --upgrade $pkg; done
import os
import pip
from subprocess import call, check_call
pip_check_list = ['pip', 'pip3']
pip_list = []
FNULL = open(os.devnull, 'w')
for s_pip in pip_check_list:
try:
check_call([s_pip, '-h'], stdout=FNULL)
pip_list.append(s_pip)
except FileNotFoundError:
pass
for dist in pip.get_installed_distributions():
for pip in pip_list:
call("{0} install --upgrade ".format(pip) + dist.project_name, shell=True)
Я взял @Ramana ответ и сделал его дружеским.
Вот моя вариация:
pip list --outdated --format=legacy | awk '{print $1;}' | xargs -n1 pip install -U
Самый короткий и легкий, который я могу найти:
pip install -U $(pip freeze | cut -d"=" -f1)
Клавиша $(cmd)
позволяет обернуть любую командную строку оболочки (она возвращает свой вывод).
pip list -o | cut -d' ' -f1 | xargs -n1 pip install -U 2> /dev/null
если у вас есть 2 разные версии python, и вы хотите обновить весь пакет python3, просто введите pip3
вместо pip
.
2> /dev/null
предназначен для избавления от всего досадного сообщения об ошибке
Чистый bash/zsh oneliner для этого:
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
Быстрый "обновленный" способ обновления всех установленных пакетов может быть следующим:
for pkg in $(pip list | cut -d' ' -f1) ; do pip install $pkg -U ; done
Если вы хотите, чтобы обновление было только упаковано, установленным в pip, и чтобы не обновлять пакеты, установленные другими инструментами (например, apt, yum и т.д.), Вы можете использовать этот скрипт, который я использую на своем Ubuntu (возможно, работает и на других дистрибутивах) - на основании этого сообщения:
printf "To update with pip: pip install -U"
pip list --outdated 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo
лучшее решение, которое работает даже в conda env:
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 |cut -d ':' -f 2 | xargs -n1 pip install -U
python -c 'import pip; [pip.main(["install", "--upgrade", d.project_name]) for d in pip.get_installed_distributions()]'
Один вкладыш!
установить jq сначала (mac):
$brew установить jq
2.
$pip3 install --upgrade `pip3 list --outdated --format json | jq '.[] | .name' | awk -F'"' '{print $2}'`
pip list | awk -F ' ' '{print $1}' | xargs -l pip install --upgrade
pip freeze
(например,bundle install
илиnpm shrinkwrap
). Лучше всего сохранить копию этого перед тем, как возиться.pip
установкуpip
, когда обновляетеrequests
. Сообщение об ошибке неcannot import name IncompleteRead
.