Как обновить все пакеты Python с помощью pip?
Можно ли обновить все пакеты Python одновременно с помощью pip
?
Обратите внимание: на официальном трекере проблем есть запрос для этого.
Ответы
Ответ 1
Пока нет встроенного флага, но вы можете использовать
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).
Ответ 2
Вы можете использовать следующий код 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)
Ответ 3
Чтобы обновить все локальные пакеты; вы можете использовать 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.
Ответ 4
Работает на 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
Вы можете выбрать "а" для обновления всех пакетов; если одно обновление не удалось, запустите его снова и оно продолжится на следующем.
Ответ 5
Версия Windows после консультации с отличной документацией для FOR
by Rob van der Woude
for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
Ответ 6
$ pip install pipupgrade
$ pipupgrade --latest --yes
pipupgrade поможет вам обновить вашу систему, локальные или пакеты из requirements.txt
файла! Он также выборочно обновляет пакеты, которые не нарушают изменения. pipupgrade также обеспечивает обновление пакетов, представленных в нескольких средах Python. Совместим с Python2. 7+, Python3. 4+ и pip9+, pip10+, pip18+, pip19+.
ПРИМЕЧАНИЕ: я автор инструмента.
Ответ 7
Вы можете просто распечатать устаревшие пакеты
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Ответ 8
Следующая строка может оказаться полезной:
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
Ответ 9
Этот вариант кажется мне более простым и читабельным:
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}'
выбирает первое слово каждой строки.
Ответ 10
Более надежное решение
Для 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 тогда как есть проблемы даже с самыми популярными решениями.
- Проблемы с переносимостью из-за изменения параметров командной строки pip
- Сбой xargs из-за сбоев дочерних процессов pip или pip3
- Переполненный вход в журнал из исходного файла xargs
- Опираясь на мост Python-to-OS, потенциально обновляя его 3
Приведенная выше команда использует простейший и самый переносимый синтаксис пипсов в сочетании с 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, может быть потенциальной причиной повреждения базы данных тупика или пакета.
Ответ 11
Это выглядит более кратким.
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
Ответ 12
У меня была такая же проблема с обновлением. Дело в том, что я никогда не обновляю все пакеты. Я обновляю только то, что мне нужно, потому что проект может сломаться.
Поскольку не было простого способа обновления пакета за пакетом и обновления файла 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
в свою команду.
Полное раскрытие: я написал этот пакет.
Ответ 13
Из https://github.com/cakebread/yolk:
$ pip install -U `yolk -U | awk '{print $1}' | uniq`
однако вам нужно сначала получить желток:
$ sudo pip install -U yolk
Ответ 14
Однострочный вариант ответа @Ramana.
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
'
Ответ 15
при использовании virtualenv, и если вы просто хотите обновить пакеты добавлены к вашему virtualenv, вы можете захотеть сделать:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
Ответ 16
Решение Windows Powershell
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Ответ 17
Самое простое и быстрое решение, которое я нашел в обсуждении проблемы с протоколом:
sudo -H pip install pipdate
sudo -H pipdate
Источник: https://github.com/pypa/pip/issues/3819
Ответ 18
Вы можете попробовать следующее:
for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
Ответ 19
Удивительный желток делает это легко.
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
Это может сделать много вещей, которые вы, вероятно, найдете полезными.
Ответ 20
используйте пакеты обновления awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
обновление Windows PowerShell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
Ответ 21
Ответ @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).
Ответ 22
Отправлено через запрос 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
Ответ 23
Казалось, это сработало для меня...
pip install -U $(pip list --outdated|awk '{printf $1" "}')
Я использовал printf
с последующим пространством для правильного разделения имен пакетов.
Ответ 24
Самый короткий и простой в Windows.
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Ответ 25
Разве это не эффективнее?
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
принимает один аргумент из оставшегося от него канала и передает его команде для обновления списка пакетов.
Ответ 26
Мой script:
pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
Ответ 27
Это решение 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
после этого следует убедиться, что никакие зависимости не сломаны.
Ответ 28
Как насчет:
pip install -r <(pip freeze) --upgrade
Ответ 29
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
Ответ 30
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)
Работает быстро, так как не постоянно запускает оболочку. Я хотел бы найти время, чтобы получить это на самом деле, используя список, устаревший, чтобы ускорить работу еще больше.