Можно ли обновить все пакеты Python одновременно с помощью pip
?
Обратите внимание: на официальном трекере проблем есть запрос для этого.
Можно ли обновить все пакеты 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).
Вы можете использовать следующий код 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)
Чтобы обновить все локальные пакеты; вы можете использовать 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.
Работает на 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
Вы можете выбрать "а" для обновления всех пакетов; если одно обновление не удалось, запустите его снова и оно продолжится на следующем.
Версия Windows после консультации с отличной документацией для FOR
by Rob van der Woude
for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
$ pip install pipupgrade
$ pipupgrade --latest --yes
pipupgrade поможет вам обновить вашу систему, локальные или пакеты из requirements.txt
файла! Он также выборочно обновляет пакеты, которые не нарушают изменения. pipupgrade также обеспечивает обновление пакетов, представленных в нескольких средах Python. Совместим с Python2. 7+, Python3. 4+ и pip9+, pip10+, pip18+, pip19+.
ПРИМЕЧАНИЕ: я автор инструмента.
Вы можете просто распечатать устаревшие пакеты
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Следующая строка может оказаться полезной:
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
Этот вариант кажется мне более простым и читабельным:
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}'
выбирает первое слово каждой строки.
Более надежное решение
Для 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, может быть потенциальной причиной повреждения базы данных тупика или пакета.
Это выглядит более кратким.
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
У меня была такая же проблема с обновлением. Дело в том, что я никогда не обновляю все пакеты. Я обновляю только то, что мне нужно, потому что проект может сломаться.
Поскольку не было простого способа обновления пакета за пакетом и обновления файла 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
в свою команду.
Полное раскрытие: я написал этот пакет.
Из 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()]'
'
при использовании 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
Вы можете попробовать следующее:
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
Это может сделать много вещей, которые вы, вероятно, найдете полезными.
используйте пакеты обновления awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
обновление Windows PowerShell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
Ответ @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).
Отправлено через запрос 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
Казалось, это сработало для меня...
pip install -U $(pip list --outdated|awk '{printf $1" "}')
Я использовал printf
с последующим пространством для правильного разделения имен пакетов.
Самый короткий и простой в 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
принимает один аргумент из оставшегося от него канала и передает его команде для обновления списка пакетов.Мой script:
pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
Это решение 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
после этого следует убедиться, что никакие зависимости не сломаны.
Как насчет:
pip install -r <(pip freeze) --upgrade
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
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)
Работает быстро, так как не постоянно запускает оболочку. Я хотел бы найти время, чтобы получить это на самом деле, используя список, устаревший, чтобы ускорить работу еще больше.