Как обновить все пакеты 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

Используйте pipupgrade !

$ pip install pipupgrade
$ pipupgrade --latest --yes

pipupgrade поможет вам обновить вашу систему, локальные или пакеты из requirements.txt файла! Он также выборочно обновляет пакеты, которые не нарушают изменения. pipupgrade также обеспечивает обновление пакетов, представленных в нескольких средах Python. Совместим с Python2. 7+, Python3. 4+ и pip9+, pip10+, pip18+, pip19+.

enter image description here

ПРИМЕЧАНИЕ: я автор инструмента.

Ответ 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 $_}

Ответ 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)

Работает быстро, так как не постоянно запускает оболочку. Я хотел бы найти время, чтобы получить это на самом деле, используя список, устаревший, чтобы ускорить работу еще больше.