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

Примечание : для этого есть запрос функции официальный трекер

2342
thedjpetersen 27 Апр 2010 в 13:23

30 ответов

Лучший ответ

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

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) ,

2137
Dukeling 6 Авг 2018 в 13:33

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

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
7
Pang 23 Апр 2018 в 07:25

Вы можете просто распечатать пакеты, которые устарели

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
73
janrito 10 Июн 2011 в 12:50

Вот мой вариант ответа rbp, который обходит «редактируемые» и разрабатываемые дистрибутивы. У него есть два недостатка оригинала: он перезагружает и переустанавливает без необходимости; и ошибка в одном пакете предотвратит обновление каждого пакета после этого.

pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --

Связанные сообщения об ошибках, немного отсоединенные после перехода с bitbucket:

5
Tobu 26 Май 2011 в 08:30

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

pip install -U `pip list --outdated | awk 'NR>2 {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

В команде awk NR>2 пропускает первые две записи (строки), а {print $1} выбирает первое слово в каждой строке (как предложил SergioAraujo, я удалил tail -n +3, поскольку awk действительно может обрабатывать пропуски записей).

63
Marc 25 Фев 2020 в 16:57

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

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
20
brunobord 13 Сен 2011 в 09:42

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

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
9
Samuel Marks 26 Янв 2014 в 09:31

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
9
adrin 24 Окт 2018 в 08:19

Следующая строка может оказаться полезной:

(пункт> 20,0)

pip list --format freeze --outdated | sed 's/=.*//g' | xargs -n1 pip install -U

Старые версии:

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
64
raratiru 27 Янв 2020 в 11:38

Это решение 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

После этого следует убедиться, что зависимости не нарушены.

7
Nils Ballmann 4 Июл 2017 в 13:49

Обновить все локальные пакеты; Вы можете использовать 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.

627
Community 23 Май 2017 в 12:02

Вы можете использовать следующий код 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)
657
Manishankar Singh 17 Сен 2018 в 12:55

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

Для 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

По состоянию на июль 2017 года OSX поставляется с очень старой версией sed (дюжиной лет). Чтобы получить расширенные регулярные выражения, используйте -E вместо -r в решении выше.

Решение проблем с помощью популярных решений

1

  • Проблемы переносимости из-за изменения функций командной строки pip
  • Сбой xargs из-за общих сбоев дочерних процессов pip или pip3
  • Переполненное ведение журнала из вывода необработанных xargs
  • Опираясь на мост Python-to-OS, потенциально обновляя его 3

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

49
Douglas Daseeco 30 Июл 2017 в 00:46

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

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 аргумент из канала слева от него и передает его команде для обновления списка пакетов.
6
Alex V 25 Июн 2017 в 14:11

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

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

312
T.Todua 24 Июл 2019 в 18:47

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

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
126
Stevoisiak 26 Апр 2018 в 15:29

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

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

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

enter image description here

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

98
Achilles Gasper Rasquinha 10 Май 2019 в 16:37

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

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

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

11
Stevoisiak 26 Апр 2018 в 15:31

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

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

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

33
Simion Agavriloaei 26 Апр 2017 в 18:43

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

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 +0,3

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

12
BioGeek 26 Июл 2016 в 16:34

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

Обновление Windows PowerShell < Код > foreach ($ p in $ (pip freeze)) {pip install -U $ p.Split ("=") [0]}

14
JohnDHH 29 Дек 2018 в 04:59

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

sudo -H pip install pipdate
sudo -H pipdate

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

14
Nico Schlömer 13 Сен 2017 в 08:34

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

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

`

26
Stevoisiak 26 Апр 2018 в 15:32

Казалось, это работает для меня ...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

Я использовал printf с пробелом для правильного разделения имен пакетов.

9
SaxDaddy 5 Авг 2015 в 22:20

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

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
12
Simon MᶜKenzie 17 Июл 2013 в 02:01

Решение Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
17
Apeirogon Prime 16 Сен 2016 в 09:07

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

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

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

$ sudo pip install -U yolk
27
Thomas Grainger 3 Янв 2013 в 18:02

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

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

38
Shihao Xu 18 Дек 2016 в 18:30

Мой сценарий:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
6
Icyblade 10 Янв 2017 в 02:17

Как насчет:

pip install -r <(pip freeze) --upgrade
7
user8598996 12 Сен 2017 в 16:50