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

1575

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

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

  • 23
    Остерегайтесь программного гниения - обновление зависимостей может сломать ваше приложение. Вы можете перечислить точную версию всех установленных пакетов с помощью pip freeze (например, bundle install или npm shrinkwrap ). Лучше всего сохранить копию этого перед тем, как возиться.
  • 0
    Будьте осторожны, когда делаете это, вы сбиваете с pip установку pip , когда обновляете requests . Сообщение об ошибке не cannot import name IncompleteRead .
Показать ещё 8 комментариев
Теги:
pip

51 ответ

1802
Лучший ответ

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

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

  • 43
    Правильно :( Теперь проблема живет по адресу github.com/pypa/pip/issues/59 . Но на каждое предложение, похоже, отвечает «Да, но я слишком уверен, что X - правильный способ сделать Y» ... Теперь лучше, чем никогда? Практичность побеждает чистоту?
  • 14
    Он также печатает те пакеты, которые были установлены с помощью обычного менеджера пакетов (например, apt-get или Synaptic). Если я выполню этот pip install -U , он обновит все пакеты. Боюсь, это может вызвать конфликт с apt-get.
Показать ещё 39 комментариев
597

Вы можете использовать следующий код 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)
  • 15
    Это работает удивительно хорошо ... Это всегда так приятно, когда задача занимает ДЕЙСТВИТЕЛЬНО много времени ... и дает вам кучу новых вещей! PS: Запустите его как root, если вы работаете в OS X!
  • 45
    Нет ли способа установить с помощью pip без вызова подпроцесса? Что-то вроде import pip pip.install('packagename') ?
Показать ещё 19 комментариев
514

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

  • 9
    Обратите внимание - это выглядит великолепно, но в настоящее время бесполезно для Windows, поскольку устанавливает скрипты без расширения.
  • 6
    @julianz: да. Это известная проблема . Добавьте расширения .py в качестве обходного пути . Хотя есть и другие unixism, такие как вызов cat , sort в коде.
Показать ещё 18 комментариев
203

Работает в Windows. Должно быть хорошо и для других. ($ - любой каталог, в котором вы находитесь, в командной строке, например: C: /Users/Username>)

делать

$ pip freeze > requirements.txt

откройте текстовый файл, замените == на> =

затем сделайте

$ pip install -r requirements.txt --upgrade

Если у вас возникла проблема с определенным пакетом, останавливающим обновление (иногда с помощью numpy), просто перейдите в каталог ($), закомментируйте имя (добавьте # перед ним) и снова запустите обновление. Позднее вы можете раскомментировать этот раздел. Это также отлично подходит для копирования глобальных сред python.

Мне также нравится метод проверки пипса:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

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

  • 24
    Вы должны удалить requirements.txt =={version} . Например: python-dateutil==2.4.2 для python-dateutil для всех строк.
  • 3
    Я обнаружил, что это на самом деле не обновляет пакеты в macOS.
Показать ещё 6 комментариев
95

Версия Windows после консультации с отличной документацией для FOR by Rob van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
  • 11
    for /F "delims= " %i in ('pip list --outdated') do pip install -U %i Быстрее, так как он будет пытаться только обновлять "устаревшие" пакеты
  • 1
    @RefaelAckermann Я подозреваю, что это будет медленнее, чем оригинал :) Чтобы узнать, какие пакеты устарели, pip должен сначала проверить, какая последняя версия каждого пакета. Он выполняет те же действия, что и первый шаг при обновлении, и не выполняется, если нет более новой версии. Однако в вашей версии pip проверит версии два раза, первый раз, чтобы установить список устаревших пакетов, и второй раз при обновлении пакетов в этом списке.
Показать ещё 2 комментария
67

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

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
  • 14
    Внутри virtualenv я делаю это так: pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
  • 0
    В настоящее время вы также можете сделать это с python -m pip list outdated (хотя он не в формате требований).
60

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

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
  • 0
    Пришлось добавить фильтры для строк, начинающихся с 'Could' и 'Some', потому что, очевидно, pip отправляет предупреждения на стандартный вывод :(
  • 0
    ОК, это справедливо: вы можете добавить как можно больше | sed 's/^<First characters of the error>.*//' мере необходимости. Спасибо!
Показать ещё 1 комментарий
48

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

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}' выбирает первое слово каждой строки.

  • 0
    В случае сбоя одного обновления ни одно из этих обновлений не произойдет.
36

Это выглядит более кратким.

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

  • 0
    Я получил это предупреждение DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
  • 1
    @Reman: это потому, что вы используете Pip v9.0.1. Это просто сообщение об устаревании, означающее, что некоторые функции не сохранятся в будущем выпуске Pip. Не о чем беспокоиться;)
Показать ещё 1 комментарий
27

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

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

  • 0
    Другой способ преодолеть юрский BSD sed в OS X - использовать gsed (GNU sed). Чтобы получить его, brew install gnu-sed
  • 0
    @WalterTross ... Jurassic ... хорошее прилагательное. Итак, теперь у нас есть два способа сгруппировать пакеты обновлений pip с хорошим контрольным журналом на терминале. (1) Используйте опцию -E, как в ответе, и (2) установите gsed, чтобы покинуть юрский период.
27

Из https://github.com/cakebread/yolk:

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

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

$ sudo pip install -U yolk
25

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

Поскольку не было простого способа обновления пакета за пакетом и обновления файла 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 в свою команду.

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

  • 7
    Это то, что пип должен делать по умолчанию.
  • 0
    в хедз-апе с вашим инструментом некоторые экранированные символы, похоже, не работают правильно на моей машине с Windows, но в остальном это нормально
Показать ещё 3 комментария
24

Однострочный вариант ответа @Ramana.

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

'

  • 4
    subprocess.call ("sudo pip install ... если вам нужны разрешения
  • 3
    @MaximilianoRios Пожалуйста, не sudo pip install , используйте вместо этого виртуальную среду .
16

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

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

Решение Windows Powershell

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

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

sudo -H pip install pipdate
sudo -H pipdate

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

  • 0
    Кроме того, он должен работать без sudo
  • 1
    В то время как другие решения зашли в тупик при обнаружении малейшей аномалии, это решение предупредило, а затем пропустило проблему, чтобы продолжить работу с другими пакетами. Большой!
12

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

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

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

  • 0
    Он не поддерживает Python 3.
  • 3
    Он поддерживает Python 3. Я использую эту команду под Python 3.5, и она прекрасно работает.
Показать ещё 1 комментарий
12

Вы можете попробовать следующее:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
  • 0
    это самый чистый, максимально читаемый способ обновления пакетов pip с максимальной краткостью. отличный.
10

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

  • 0
    В Ubuntu (и других производных Debian) pip помещает пакеты в /usr/local/lib/python2.7/dist-packages или аналогичные. В этом случае вы можете использовать '/ usr / local / lib /' вместо 'site-packages' в операторе if .
9

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

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

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

Изображение 2484

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

  • 1
    Этот метод имеет более чистый вывод, чем ответ @ rbp
  • 2
    Хорошая идея, но она застряла на Checking... навсегда, когда я попробовал.
Показать ещё 1 комментарий
9

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

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

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

9

Отправлено через запрос 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
8

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

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

  • 0
    заморозка пипсов | awk -F '[=]' '{print $ 1}' | xargs pip install -U
6

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

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
  • 0
    -r не нужен и делает эту команду неудачной в Windows
  • 0
    @Enkouyami на Windows 7 эта команда не работает без -r. -r должен исключать путь к файлу требований.
6

Мой script:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
6

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

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 принимает один аргумент из оставшегося от него канала и передает его команде для обновления списка пакетов.
  • 0
    Вот мой вывод: kerberos iwlib PyYAML Could pygpgme Could Could Could ... Обратите внимание на все «Could». Они вытекают из вывода pip list -o из "Не удалось найти загрузки, которые удовлетворяют требованию <пакет>"
  • 0
    Можете ли вы вставить вывод pip list -o ?
Показать ещё 3 комментария
5

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

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

5

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
  • 1
    Шаг 1: pip install pip-upgrade-устаревший Шаг 2: pip-upgrade-устаревший ... сделано
5

Как насчет:

pip install -r <(pip freeze) --upgrade
5
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)

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

  • 0
    Действительно ли постоянный запуск оболочки имеет ощутимую разницу, когда мы заканчиваем загрузкой пакетов из pypi с последующей (компиляцией и) установкой?
  • 0
    @gerrit По моему опыту, да, особенно в среде, где у вас агрессивное антивирусное программное обеспечение, которое вы не можете отключить. Там, где я работаю, мы не можем отключить или отключить AV, и каждый запуск оболочки занимает 20-30 секунд, но в хорошие дни у нас есть быстрое подключение к Интернету. Когда вы устанавливаете большие пакеты, время установки может быть значительным, но когда это намного меньше, время запуска оболочки очень важно.
5

Вот сценарии, которые обновляют только устаревшие пакеты.

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "--outdated", "--format=legacy"])
line = str(file).split()

for distro in line[::6]:
    call("pip install --upgrade " + distro, shell=True)

Для новой версии pip, которая не выводится как устаревший формат (версия 18+).

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "-o", "--format=json"])
line = str(file).split()

for distro in line[1::8]:
    distro = str(distro).strip('"\",')
    call("pip install --upgrade " + distro, shell=True)
  • 0
    Это, к сожалению, больше не работает. pip --format не принимает "legacy" в качестве выбора. По крайней мере, не в моем выпуске Python.
  • 0
    @JanSchnupp обновлено для новой версии
Показать ещё 2 комментария
4

Просмотреть устаревшие пакеты

 pip list --outdated --format=columns

устанавливать

 sudo pip install pipdate

затем введите

 sudo -H pipdate
4

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

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

4

Я использовал pur в последнее время. Это просто и точно. Он обновляет ваш файл requirements.txt, чтобы отобразить обновления, и вы можете обновить его с помощью файла requirements.txt, как обычно.

$ pip install pur
...
Successfully installed pur-4.0.1

$ pur
Updated boto3: 1.4.2 -> 1.4.4
Updated Django: 1.10.4 -> 1.10.5
Updated django-bootstrap3: 7.1.0 -> 8.1.0
All requirements up-to-date.

$ pip install --upgrade -r requirements.txt
Successfully installed Django-1.10.5 ...
4

вот еще один способ сделать с script в python

import pip, tempfile, contextlib

with tempfile.TemporaryFile('w+') as temp:
    with contextlib.redirect_stdout(temp):
        pip.main(['list','-o'])
    temp.seek(0)
    for line in temp:
        pk = line.split()[0]
        print('--> updating',pk,'<--')
        pip.main(['install','-U',pk])
4

Я пробовал код Ramana, и я узнал, что на Ubuntu вам нужно написать sudo для каждой команды. Вот мой script, который отлично работает на ubuntu 13.10:

#!/usr/bin/env python
import pip
from subprocess import call

for dist in pip.get_installed_distributions():
    call("sudo pip install --upgrade " + dist.project_name, shell=True)
4

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

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

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

2

Одна строка в cmd:

for /F "delims= " %i in ('pip list --outdated --format=legacy') do pip install -U %i

Таким образом,

pip check

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

2

В качестве другого ответа здесь говорится:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U

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

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U

Обратите внимание на добавленный sudo -H, который позволил команде ром с правами root.

  • 0
    Используйте первую версию с виртуальной средой и вторую ( sudo -H ) версию при обновлении пакетов для всей вашей системы.
2

И еще один способ: for pkg in $(pip list | cut -d' ' -f1); do sudo pip install --upgrade $pkg; done

2
import os
import pip
from subprocess import call, check_call

pip_check_list = ['pip', 'pip3']
pip_list = []
FNULL = open(os.devnull, 'w')


for s_pip in pip_check_list:
    try:
        check_call([s_pip, '-h'], stdout=FNULL)
        pip_list.append(s_pip)
    except FileNotFoundError:
        pass


for dist in pip.get_installed_distributions():
    for pip in pip_list:
        call("{0} install --upgrade ".format(pip) + dist.project_name, shell=True)

Я взял @Ramana ответ и сделал его дружеским.

2

Вот моя вариация:

pip list --outdated --format=legacy | awk '{print $1;}' | xargs -n1 pip install -U
1

Самый короткий и легкий, который я могу найти:

pip install -U $(pip freeze | cut -d"=" -f1)

Клавиша $(cmd) позволяет обернуть любую командную строку оболочки (она возвращает свой вывод).

1
pip list -o | cut -d' ' -f1 | xargs -n1 pip install -U 2> /dev/null

если у вас есть 2 разные версии python, и вы хотите обновить весь пакет python3, просто введите pip3 вместо pip.

2> /dev/null предназначен для избавления от всего досадного сообщения об ошибке

0

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

Быстрый "обновленный" способ обновления всех установленных пакетов может быть следующим:

for pkg in $(pip list | cut -d' ' -f1) ; do pip install $pkg -U ; done
0

Если вы хотите, чтобы обновление было только упаковано, установленным в pip, и чтобы не обновлять пакеты, установленные другими инструментами (например, apt, yum и т.д.), Вы можете использовать этот скрипт, который я использую на своем Ubuntu (возможно, работает и на других дистрибутивах) - на основании этого сообщения:

printf "To update with pip: pip install -U"
pip list --outdated 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo
0

лучшее решение, которое работает даже в conda env:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 |cut -d ':' -f 2 | xargs -n1 pip install -U
0
python -c 'import pip; [pip.main(["install", "--upgrade", d.project_name]) for d in pip.get_installed_distributions()]'

Один вкладыш!

0
  • установить jq сначала (mac):

    $brew установить jq

2.

$pip3 install --upgrade  `pip3 list --outdated --format json | jq '.[] | .name' | awk -F'"' '{print $2}'`
-1
pip list | awk -F ' ' '{print $1}' | xargs -l pip install --upgrade   

Ещё вопросы

Сообщество Overcoder
Наверх
Меню