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

2055

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

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

thedjpetersen
источник
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 .

JFS
источник
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

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

azazelspeaks
источник
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:'
janrito
источник
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
raratiru
источник
Пришлось добавить фильтры для строк, начинающихся с '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
28

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

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

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

$ sudo pip install -U yolk
TKR
источник
1
Последний коммит 7 лет назад
Борис
в 2013 году н.э.
дотбит
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
brunobord
источник
19

Решение Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Апейрогон Прайм
источник
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
Foad
2
Возможно, pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}было бы более уместным.
мозговой заговор
19

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

pip install pipdate
pipdate

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

RedEyed
источник
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]}

JohnDHH
источник
заморозка пипсов | 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

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

user1175849
источник
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 не использовали ). строка документация

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

SaxDaddy
источник
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

Как насчет:

pip install -r <(pip freeze) --upgrade
user8598996
источник
7

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

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

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

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
Icyblade
источник
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 аргумент из канала слева от него и передает его команде для обновления списка пакетов.
Алекс V
источник
Вот мой вывод: 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}

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

Себастьян Вецковский
источник