Обновление всех пакетов с помощью pip

Можно ли обновить все пакеты Python одновременно pip?

Обратите внимание, что на официальном трекере ошибок есть запрос для этого.

67 ответов

Решение

Пока нет встроенного флага, но вы можете использовать

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-review:

$ pip install pip-review
$ pip-review --local --interactive

pip-review это вилка pip-tools, Увидеть pip-tools проблема, упомянутая @knedlsepp. pip-review пакет работает но pip-tools пакет больше не работает.

pip-review работает на Windows начиная с версии 0.5.

Вы можете использовать следующий код 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)

Работает на 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

Вы можете выбрать "а" для обновления всех пакетов; если одно обновление не удалось, запустите его снова и оно продолжится на следующем.

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

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

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

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

Версия для Windows после ознакомления с отличной документацией для FOR Роб ван дер Вуде

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i

Этот вариант кажется мне более простым и читабельным:

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 --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 freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

Более надежное решение

Для pip3 используйте это:

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

Для пункта, просто удалите 3s как таковые:

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

OSX Oddity

По состоянию на июль 2017 года OSX поставляется с очень старой версией 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'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 \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, может стать потенциальной причиной тупика или повреждения базы данных пакета.

У меня была такая же проблема с обновлением. Дело в том, что я никогда не обновляю все пакеты. Я обновляю только то, что мне нужно, потому что проект может сломаться.

Поскольку не было простого способа обновить пакет за пакетом и обновить файл require.txt, я написал этот pip-upgradeer, который также обновляет версии в вашем 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 аргумент в вашу команду.

Полное раскрытие: я написал этот пакет.

Это кажется более кратким.

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

Однострочная версия ответа @ Раманы.

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

`

С https://github.com/cakebread/yolk:

$ pip install -U `yolk -U | awk '{print $1}' | uniq`

однако сначала нужно получить желток:

$ sudo pip install -U yolk

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's version number and exit

Шаг 1:

pip install pip-upgrade-outdated

Шаг 2:

pip_upgrade_outdated

При использовании virtualenv и если вы просто хотите обновить пакеты, добавленные в virtualenv, вы можете сделать следующее:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade

Обновление пакетов Python в Windows или Linux

1-Вывести список установленных пакетов в файл требований (requirements.txt):

      pip freeze > requirements.txt

2- Отредактируйте файл requirements.txt и замените все '==' на '> ='. Используйте команду «Заменить все» в редакторе.

3 - Обновите все устаревшие пакеты

      pip install -r requirements.txt --upgrade

Источник: https://www.activestate.com/resources/quick-reads/how-to-update-all-python-packages/

Решение Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}

Самое простое и быстрое решение, которое я нашел в обсуждении проблемы пипсов:

sudo -H pip install pipdate
sudo -H pipdate

Источник: https://github.com/pypa/pip/issues/3819

Используйте пакеты обновления awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

Одна строка в 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}

это работает гладко, если в списке нет сломанных пакетов или специальных колес...

Вы можете попробовать это:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done

Чистый 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

Довольно удивительный желток делает это легко.

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

Он может сделать много вещей, которые вы, вероятно, найдете полезными.

Как насчет:

pip install -r <(pip freeze) --upgrade

Не надо так заморачиваться или устанавливать какой-то пакет.

Обновите пакеты pip в оболочке Linux:

      pip list --outdated --format=freeze | awk -F"==" '{print $1}' | xargs -i pip install -U {}

Обновите пакеты pip в Windows PowerShell:

      pip list --outdated --format=freeze | ForEach { pip install -U $_.split("==")[0] }

Некоторые моменты:

  • Заменять pipкак ваша версия Python для pip3или же pip2.
  • pip list --outdatedдля проверки устаревших пакетов pip.
  • --formatв моей версии pip 22.0.3 есть только 3 типа: столбцы (по умолчанию), замораживание или json. freezeэто лучший вариант в командных каналах.
  • Сохраняйте команду простой и удобной для использования в максимально возможном количестве систем.

Самый короткий и простой на Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt

Ответ @ Раманы работал лучше для меня, из тех, кто здесь, но мне пришлось добавить несколько уловов:

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 check исключает мои пакеты разработки, потому что они не находятся в системном каталоге site-packages. Try-кроме просто пропускает пакеты, которые были удалены из PyPI.

@endolith: я надеялся на легкий pip.install(dist.key, upgrade=True)тоже, но не похоже, что pip предназначался для использования кем-либо, кроме командной строки (в документах не упоминается внутренний API, а разработчики pip не использовали строки документов).

Разве это не более эффективно?

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 
  1. pip list -o списки устаревших пакетов;
  2. grep -v -i warning перевернутый матч на warning чтобы избежать ошибок при обновлении
  3. cut -f1 -d1' ' возвращает первое слово - название устаревшего пакета;
  4. tr "\n|\r" " " преобразует многострочный результат из cut в однострочный, разделенный пробелами список;
  5. awk '{if(NR>=3)print}' пропускает строки заголовка
  6. cut -d' ' -f1 выбирает первый столбец
  7. xargs -n1 pip install -U берет 1 аргумент из канала слева от него и передает его команде для обновления списка пакетов.

Послано через запрос на получение ответа народу пипа; тем временем используйте это решение для библиотеки пипсов, которое я написал:

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
Другие вопросы по тегам