Как обновить все пакеты Python с помощью pip?


2055

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

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


37
Остерегайтесь программной гнили - обновление зависимостей может сломать ваше приложение. Вы можете перечислить точную версию всех установленных пакетов с помощью pip freeze(как bundle installили npm shrinkwrap). Лучше всего сохранить копию этого перед тем, как возиться.
— полковник Паник

Будьте осторожны, когда делаете это, вы портите pipустановку, когда обновляете requests. Сообщение об ошибке cannot import name IncompleteRead.
— Пол Руни

11
Я попробовал кучу ответов, и более новый (и, следовательно, ответ с низким баллом) дает гораздо лучший результат: stackoverflow.com/questions/2720014/…
— FauChristian


Этот вопрос настолько старый и настолько полезный, что я просто хочу предупредить всех, кто приедет сюда с этого момента, что теперь есть новый официальный лучший способ сделать все это: pipenv. Документы находятся здесь: docs.pipenv.org/basics, а автор Pycon 2018 рассказывает об этом здесь: youtube.com/watch?v=GBQAKldqgZs . Удачного кодирования!
— Малик А. Руми

Ответы:


2264

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

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


59
Правильно :( Теперь проблема стоит на github.com/pypa/pip/issues/59 . Но на каждое предложение, похоже, отвечает «Да, но я слишком уверен, что X - правильный способ сделать Y» ... Теперь лучше, чем никогда? Практичность превосходит чистоту? :(
— rbp

20
Он также печатает те пакеты, которые были установлены с помощью обычного менеджера пакетов (например, apt-get или Synaptic). Если я выполню это pip install -U, он обновит все пакеты. Боюсь, это может вызвать конфликт с apt-get.
— Джабба

8
Как насчет изменения grep на: egrep -v '^ (\ - e | #)' (я получаю эту строку, когда запускаю ее в Ubuntu 12.10: "## FIXME: не удалось найти URL-адрес SVN в зависимых ссылках для этого пакета:".
— LasseValentini

32
Я teeдобавлю перед выполнением фактического обновления, чтобы вы могли получить список исходных версий. Например, pip freeze --local | tee before_upgrade.txt | ...так было бы легче вернуться, если есть какие-либо проблемы.
— Эмиль Х

10
Я добавил, -Hчтобы sudoизбежать раздражающего сообщения об ошибке: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
— Mario S

683

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

21
Это работает удивительно хорошо ... Это всегда так приятно, когда задача занимает ДЕЙСТВИТЕЛЬНО много времени ... и дает вам кучу новых вещей! PS: Запустите его как root, если вы работаете в OS X!
— Алекс Грей,

52
Нет ли способа установить с помощью pip без вызова подпроцесса? Что то типа import pip pip.install('packagename')?
— эндолит

6
Я завернул это в fabfile.py . Спасибо!
— Джош К

5
@BenMezger: Вы действительно не должны использовать системные пакеты в вашем virtualenv. Вы также не должны запускать больше, чем несколько надежных, хорошо известных программ от имени root. Запустите ваши virtualenvs с --no-site-packages (по умолчанию в последних версиях).
— jeffcook2150

3
Если вы не согласны, то выбранный ответ (см. Выше) терпит неудачу, если пакет больше не может быть найден. Этот скрипт просто продолжает следующие пакеты, замечательно.
— Джош

644

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


2
@hauzer: он не поддерживает Python 3. Хотя это может быть ошибкой
— jfs

7
@mkoistinen Это хороший инструмент, но пока он не объединен с PIP, это означает установку чего-то дополнительного, что не каждый может захотеть сделать.
— Вечерняя ночь

2
@Daniel: pip-tools больше не работают, pip-review (форк pip-tools) работает.
— JFS

7
pip-обзор работает просто отлично (по крайней мере, для Python версии 3.5.0)
— FredrikHedman

16
Чтобы обновить все без интерактивного режима:pip-review --local --auto
— Dlamini

333

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

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


29
Вы должны удалить requirements.txtэто =={version}. Например: python-dateutil==2.4.2для python-dateutilвсех линий.
— youngminz

4
Я обнаружил, что это на самом деле не обновляет пакеты в macOS.
— Jkooker

10
@youngminz Я бы порекомендовал быстрое 'Заменить все "=="> "> ="' в вашем редакторе / ide перед запуском 'pip install ...', чтобы это исправить
— Amaury Liet

7
для linux: $ pip freeze | cut -d '=' -f1> requirements.txtдля того, чтобы удалить версию
— Cavaz

1
Если используемой вами оболочкой является bash, вы можете сократить ее до одной команды через pip3 install -r <(pip3 freeze) --upgrade Effectively, <(pip3 freeze)это анонимный канал, но он будет действовать как файловый объект
— Сергей Колодяжный,

128

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

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

19
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i Быстрее, так как он будет пытаться обновлять только устаревшие пакеты
— Refael Ackermann

3
@RefaelAckermann Я подозреваю, что это будет медленнее, чем оригинал :) Чтобы узнать, какие пакеты устарели, pip должен сначала проверить, какая последняя версия каждого пакета. Он выполняет те же действия, что и первый шаг при обновлении, и не выполняется, если нет более новой версии. Однако в вашей версии pip проверит версии два раза, первый раз, чтобы установить список устаревших пакетов, и второй раз при обновлении пакетов в этом списке.
— Петр Доброгост

2
@RefaelAckermann Вращение пипа на порядок быстрее, чем проверка версии пакета по сети, так что это число проверок, которые следует оптимизировать, а не количество ускорений. Мой делает n проверок, ваш делает n + m проверок.
— Петр Доброгост

2
+1 - 6.20.2019, я использую Python 3.7.3 в Windows 10, и это был лучший способ обновить все мои локальные пакеты.
— MacItaly

1
Нужно пропустить первые две строки вывода: for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Если он запускается из командного файла, обязательно используйте %%iвместо %i. Также обратите внимание, что очистку нужно обновить pipдо запуска этой команды с помощью python -m pip install --upgrade pip.
— Энди

128

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

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

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

введите описание изображения здесь

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


1
У этого метода гораздо более чистый результат, чем у ответа @ rbp
— Gaia

7
Хорошая идея, но она застряла Checking...навсегда, когда я попробовал.
— CGFoX

1
Просто установил его и тоже застрял на проверке[0;93mChecking...[0m
— Крис

1
@nathandrake хочешь открыть вопрос на странице проблем?
— Ахиллес Гаспер Раскинья

2
Получил ошибку в Windows 10 и Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
— Цинь Хейян,

74

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

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:'
— Джереми Бланшар

В настоящее время вы также можете сделать это с python -m pip list outdated(хотя это не в формате требований).
— Джектоз

74

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

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


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

2
вы можете избежать хвоста awk 'NR>2 {print $1}'очищает выход для вас
— SergioAraujo

@SergioAraujo, это делает решение более чистым, спасибо за подсказку!
— Марк

67

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

(пункт> 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

Пришлось добавить фильтры для строк, начинающихся с 'Could' и 'Some', потому что, очевидно, pip посылает предупреждения на стандартный вывод :(
— Chip Camden

Хорошо, это справедливо: вы можете добавить столько, | sed 's/^<First characters of the error>.*//'сколько вам нужно. Спасибо!
— raratiru

14
Или:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
— Йенс

51

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

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


1
другой способ преодолеть юрский BSD sedв OS X - использовать gsedвместо этого (GNU sed). Чтобы получить это,brew install gnu-sed
— Уолтер Тросс

@WalterTross ... Jurassic ... хорошее прилагательное. Итак, теперь у нас есть два способа сгруппировать пакеты обновлений pip с хорошим контрольным журналом на терминале. (1) Используйте опцию -E, как в ответе, и (2) установите gsed, чтобы покинуть юрский период.
— Дуглас Дасеко

41

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

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


Я получил это предупреждение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.
— Реман

2
@Reman: это потому, что вы используете Pip v9.0.1. Это просто сообщение об устаревании, означающее, что некоторые функции не сохранятся в будущем выпуске Pip. Не о чем беспокоиться;)
— AlessioX

Тем не менее, это должно быть отмечено как окончательное решение. Действительно, принятый ответ будет распространяться на все ваши pip-пакеты, что является пустой тратой времени, если вам нужно обновить только 1 или 2 пакета. Это решение, как и вместо этого, будет работать только со всеми устаревшими пакетами
— AlessioX

34

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

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

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


8
Это то, что пип должен делать по умолчанию.
— Nostalg.io

в хедз-апе с вашим инструментом некоторые экранированные символы не работают должным образом на моей машине с Windows, но в остальном это нормально
— Лука

Я не проверял его на Windows, но я установлю виртуальную машину. Спасибо
— Simion Agavriloaei

Если virtualenvне включенpip-upgrade --skip-virtualenv-check
— Morse

2
Это также работает с папкой требований, имеющей общие, dev и prod требования. Просто великолепно!
— cwhisperer


27

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

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 ... если вам нужны разрешения
— Максимилиано Риос

4
@MaximilianoRios Пожалуйста, не sudo pip installиспользуйте виртуальную среду .
— Бенгт

22

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

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


19

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

pip install pipdate
pipdate

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


2
В то время как другие решения зашли в тупик при обнаружении малейшей аномалии, это решение предупредило, а затем пропустило проблему, чтобы продолжить работу с другими пакетами. Большой!
— Серж Строобандт

16

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

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


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

И для python 3 ... pip3 установите -U $ (pip3 freeze | awk -F '[=]' '{print $ 1}')
— Джимми М.Г. Лим

12

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

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

это самый чистый и читаемый способ обновления пакетов pip в кратчайшие сроки. Великий.
— Марк Шуст в M.academy

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

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


3
Ваш ответ был изменен с yolkна yolk3k, ваш первоначальный ответ определенно имел проблемы с python3.
— AXO

10

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

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-кроме просто пропускает пакеты, которые были удалены из PyPI.

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


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

10

Это 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

1
Шаг 1: pip install pip-upgrade-устаревший Шаг 2: pip-upgrade-устаревший ... готово
— shao.lo

9

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

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

Версия с обработкой ошибок (согласно комментарию): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
— Сэмюэл Маркс,

9

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

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

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


7

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

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

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

@Enkouyami на Windows 7 эта команда не работает без -r. -r должен исключать путь к файлу требований.
— Chockomonkey

6

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

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

Вот мой вывод: kerberos iwlib PyYAML Could pygpgme Could Could Could ...Обратите внимание на все «Могли». Они вытекают из вывода pip list -o«Не удалось найти загрузки, которые удовлетворяют требованию <пакет>»
— DrStrangepork

Можете ли вы вставить вывод pip list -o?
— Алекс V

Комментарии не очень хорошо отформатируют, но вот фрагмент кода (окончания строк отмечены знаком ';'):# pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
— DrStrangepork

вместо того , чтобы отфильтровать все строки , которые не должны быть использованы, я хотел бы предложить , чтобы отфильтровать строки , где существует обновление: pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") . В противном случае вы можете легко пропустить одну строку, которая вам не нужна, и получить результат, о котором упоминал DrStrangeprk.
— Антибус

Я настоятельно рекомендую использовать xargsвместо этого. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -UВ -rфлаг гарантирует , что pip install -Uне будет выполняться , если нет устаревших пакетов. -pФлаг запрашивает у пользователя подтверждение перед выполнением любой команды. Вы можете добавить -n1флаг, чтобы он подсказывал вам перед установкой каждого пакета отдельно.
— 6

6

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.