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

2341

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

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

3
  • 50
    Остерегайтесь гниения программного обеспечения - обновление зависимостей может сломать ваше приложение. Вы можете указать точную версию всех установленных пакетов с помощью pip freeze(например, bundle installили npm shrinkwrap). Лучше сохранить копию, прежде чем возиться. Colonel Panic 22 мая '13 в 13:01
  • 1
    Если вы хотите обновить отдельный пакет и все его зависимости (возможно, более разумный подход), сделайте следующее: pip install -U --upgrade-strategy eager your-packageCyberwiz 24 февраля в 15:33
  • 3
    Я использую PowerShell 7, и в настоящее время я использую этот однострочник: pip list --format freeze | %{pip install --upgrade $_.split('==')[0]}(я пока не могу опубликовать здесь ответ)Xeнεi Ξэnвϵς 7 мар в 5:11
2541

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

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

56
  • 67
    Правильно :( Теперь проблема находится на github.com/pypa/pip/issues/59 . Но на каждое предложение, кажется, отвечает: «Да, но я слишком уверен, что X - правильный способ сделать Y» ... Сейчас лучше, чем никогда? Практичность превосходит чистоту? :(rbp 12 авг.
  • 24
    Он также распечатывает те пакеты, которые были установлены с помощью обычного диспетчера пакетов (например, apt-get или Synaptic). Если я выполню это pip install -U, он обновит все пакеты. Боюсь, это может вызвать конфликт с apt-get. Jabba 13 сен.
  • 8
    Как насчет изменения grep на: egrep -v '^ (\ - e | #)' (я получаю эту строку при запуске в ubuntu 12.10: «## FIXME: не удалось найти URL-адрес svn в dependency_links для этого пакета:».LasseValentini 5 марта '13 в 14: 292013-03-05 14:29
  • 35 год
    Я бы добавил teeперед выполнением фактического обновления, чтобы вы могли получить список исходных версий. Например, таким pip freeze --local | tee before_upgrade.txt | ...образом было бы легче вернуться в случае каких-либо проблем. Emil H 4 марта '14 в 6: 292014-03-04 06:29
  • 10
    Я добавил, -Hчтобы sudoизбежать раздражающего сообщения об ошибке: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -UMario S 17 мар.
750

Вы можете использовать следующий код 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)
24
  • 24
    Это работает на удивление хорошо ... Всегда приятно, когда задача занимает ДЕЙСТВИТЕЛЬНО много времени ... и дает вам кучу нового! PS: Запустите его как root, если у вас OS X! Alex Gray 31 дек.
  • 54
    Нет ли возможности установить с помощью pip без вызова подпроцесса? Что-то вроде import pip pip.install('packagename')? endolith 06 марта '12 в 16: 182012-03-06 16:18
  • 6
    Я завернул это в файл fabfile.py . Спасибо! Josh K 29 апр '13 в 21:54
  • 7
    @BenMezger: Вам действительно не следует использовать системные пакеты в вашем virtualenv. Вы также действительно не должны запускать больше, чем несколько надежных, хорошо известных программ с правами root. Запустите виртуальный сервер с параметром --no-site-packages (по умолчанию в последних версиях). jeffcook2150 26 авг.
  • 3
    Поднимите палец вверх, выбранный ответ (выше) не сработает, если пакет больше не может быть найден. Этот сценарий просто переходит к следующим пакетам, замечательно. Josh 03 июн.
715

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

19
  • 2
    @hauzer: Он не поддерживает Python 3. Хотя это может быть ошибкойjfs 25 апр '14 в 0:27
  • 7
    @mkoistinen Это хороший инструмент, но до тех пор, пока он не будет объединен с PIP, это означает установку чего-то дополнительного, что не все могут захотеть сделать. Wernight 22 июля '14 в 8: 502014-07-22 11:50
  • 2
    @Daniel: pip-tools больше не работает, pip-review (вилка pip-tools) работает. jfs 12 окт.
  • 7
    pip-review работает нормально (по крайней мере, для Python версии 3.5.0)FredrikHedman 13 фев '16 в 12:13
  • 23
    Чтобы обновить все без интерактивного режима:pip-review --local --autoDlamini 21 мая '18 в 1:07
383

Следующее работает в Windows и должно быть полезно и для других ( $независимо от того, в каком каталоге вы находитесь в командной строке. Например, C: / Users / Username ).

Делать

$ pip freeze > requirements.txt

Откройте текстовый файл, замените ==с >=, или СЭД сделать это для вас:

$ sed -i 's/==/>=/g' 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

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

11
  • 32
    Вам следует удалить requirements.txtфайлы =={version}. Например: python-dateutil==2.4.2для python-dateutilвсех линий. youngminz 15 мая '16 в 5: 282016-05-15 05:28
  • 5
    Я обнаружил, что это на самом деле не обновляло пакеты в macOS. jkooker 8 марта '17 в 14: 422017-03-08 14:42
  • 12
    @youngminz Я бы порекомендовал быстро 'Заменить все "=="> "> ="' в вашем редакторе / ide перед запуском 'pip install ...', чтобы исправить этоAmaury Liet 16 мар.
  • 8
    для linux: $ pip freeze | cut -d '=' -f1> requirements.txtчтобы удалить версиюCavaz 14 янв.
  • 2
    Если оболочка, которую вы используете, - это bash, вы можете сократить ее до одной команды с помощью pip3 install -r <(pip3 freeze) --upgrade Effectively, <(pip3 freeze)это анонимный канал, но он будет действовать как файловый объектSergiy Kolodyazhnyy 3 сен '18 в 22:17
217

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

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

pipupgrade поможет вам обновить вашу систему, локально или пакеты из requirements.txtфайла! Он также выборочно обновляет пакеты, не нарушающие изменений.

pipupgrade также обеспечивает обновление пакетов, присутствующих в нескольких средах Python. Он совместим с Python 2.7+, Python 3.4+ и pip 9+, pip 10+, pip 18+, pip 19+.

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

Примечание: я являюсь автором инструмента.

24
  • 2
    Этот метод имеет гораздо более чистый результат, чем ответ @ rbpGaia 27 янв.
  • 9
    Хорошая идея, но она застряла Checking...навсегда, когда я ее попробовал. CGFoX 22 марта '19 в 06:46
  • 1
    Просто установил и тоже при проверке застрял[0;93mChecking...[0mChris 29 мая '19 в 17:11
  • 1
    @nathandrake хотите открыть проблему на странице проблем? Achilles Gasper Rasquinha 15 июл.
  • 2
    Получил ошибку в Windows 10 и Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'Qin Heyang 13 ноя '19 в 3:55
141

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

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
8
  • 24
    for /F "delims= " %i in ('pip list --outdated') do pip install -U %i Быстрее, так как он будет пытаться обновлять только «устаревшие» пакетыRefael Ackermann 19 апр '16 в 19:30
  • 3
    @RefaelAckermann Я подозреваю, что это будет медленнее, чем оригинал :) Чтобы узнать, какие пакеты устарели, pip должен сначала проверить, какая последняя версия каждого пакета. Он делает то же самое, что и первый шаг при обновлении, и не продолжается, если более новая версия недоступна. Однако в вашей версии pip будет проверять версии два раза: первый раз для создания списка устаревших пакетов и второй раз при обновлении пакетов в этом списке. Piotr Dobrogost 17 янв.
  • 3
    @RefaelAckermann Раскрутка пипса на порядок быстрее, чем проверка версии пакета по сети, поэтому нужно оптимизировать именно количество проверок, а не количество запусков. Моя делает n проверок, ваша - n + m проверок. Piotr Dobrogost 18 янв.
  • 2
    +1 - Сейчас 20.06.2019, я использую Python 3.7.3 в WIndows 10, и это был лучший способ обновить все мои локальные пакеты. MacItaly 20 июня '19 в 17:44
  • 2
    Нужно пропустить первые две строки вывода: for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Если это запускается из командного файла, обязательно используйте %%iвместо %i. Также обратите внимание, что pipперед запуском этой команды проще выполнить обновление с помощью python -m pip install --upgrade pip. Andy 13 июл.
83

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

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

1
  • Если одно обновление не удается, никакие обновления не выполняются. Boris 11 ноя '18 в 14:19
74

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

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
3
  • 14
    Внутри virtualenv я делаю это так:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'Jeremy Blanchard 28 марта '12 в 22: 462012-03-28 22:46
  • В настоящее время вы также можете сделать это с помощью python -m pip list outdated(хотя это не в формате требований). Jacktose 28 окт.
  • 3
    @Jacktose, я думаю, ты имел в виду python -m pip list --outdated. Hugues 12 марта в 15:55
70

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

(пункт> 20,0)

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

Older Versions:

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
3
  • Пришлось добавить фильтры для строк, начинающихся с «Could» и «Some», потому что, по-видимому, pip отправляет предупреждения на stdout :(Chip Camden 13 авг.
  • Хорошо, это справедливо: вы можете добавить столько, | sed 's/^<First characters of the error>.*//'сколько нужно. Спасибо! raratiru 3 ноя '15 в 0:31
  • 14
    Или:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgradeJens 9 дек.
65

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

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

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

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

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

OS X странность

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

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

Это решение хорошо спроектировано и протестировано 1 , тогда как проблемы возникают даже с самыми популярными решениями.

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

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

2
  • 3
    другой способ преодолеть юрский BSD sedOS X - использовать gsedвместо него (GNU sed). Чтобы получить это,brew install gnu-sedWalter Tross 09 янв.
  • @WalterTross ... юрский ... хорошее употребление прилагательного. Итак, теперь у нас есть два способа сгруппировать пакеты обновлений с хорошим контрольным журналом на терминале. (1) Используйте опцию -E, как в ответе, и (2) установите gsed, чтобы покинуть юрский период. Douglas Daseeco 09 янв.
42

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

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

3
  • Я получил это предупреждение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.Reman 26 ноя '16 в 14:01
  • 2
    @Reman: это потому, что вы используете Pip v9.0.1. Это просто сообщение об устаревании, означающее, что некоторые функции не сохранятся в будущем выпуске Pip. Не о чем беспокоиться;)AlessioX 17 дек.
  • Однако это должно быть отмечено как окончательное решение. Действительно, принятый ответ будет распространяться на все ваши пакеты pip, что является пустой тратой времени, если вам нужно обновить только 1 или 2 пакета. Это решение, как вместо этого, будет работать только с устаревшими пакетамиAlessioX 17 дек.
37

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

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

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

6
  • 9
    Это то, что pip должен делать по умолчанию. Nostalg.io 8 июн.
  • С помощью вашего инструмента некоторые персонажи, похоже, не работают правильно на моей машине с Windows, но в остальном все в порядкеLuke 12 июл.
  • на самом деле не тестировал его на Windows, но я установлю виртуальную машину. СпасибоSimion Agavriloaei 12 июл.
  • Если virtualenvне включенpip-upgrade --skip-virtualenv-checkMorse 02 апр '18 в 15:15
  • 2
    Это также работает с папкой требований, содержащей общие требования, требования для разработчиков и продуктов. Просто здорово! cwhisperer 03 окт.
29

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

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
2
  • 5
    subprocess.call ("sudo pip install ... если вам нужны разрешенияMaximiliano Rios 27 мая '14 в 19:50
  • 4
    @MaximilianoRios Пожалуйста, не sudo pip installиспользуйте вместо этого виртуальный env . Bengt 20 фев '16 в 15:28
28

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

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

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

$ sudo pip install -U yolk
2
  • 2
    Последний коммит 7 лет назадBoris 29 июл.
  • в 2013 году нашей эрыdotbit 10 дек '19 в 19:09
24

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

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

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

pip install pipdate
pipdate

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

3
  • 3
    В то время как другие решения останавливались при обнаружении малейшей аномалии, это решение предупредило, а затем пропустило проблему, чтобы продолжить работу с другими пакетами. Большой! Serge Stroobandt 10 мая '18 в 20:14
  • проголосовать за это, отлично работает в окнахVladoPortos 11 авг.
  • 1
    Я использовал pipdate и теперь не могу найти pip или python. Используйте на свой риск. Joseph Konan 28 авг.
20

Решение Windows PowerShell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
2
  • pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}? Foad 22 мая '19 в 8:38
  • 3
    Возможно, pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}было бы более уместно. brainplot 03 янв.
18

Используйте пакеты обновления AWK :

pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

Обновление Windows PowerShell

foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
1
  • А для python 3 ... pip3 install -U $ (pip3 freeze | awk -F '[=]' '{print $ 1}')Jimmy MG Lim 3 апр '19 в 7:48
15

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
3
  • 2
    Шаг 1: pip install pip-upgrade-outdated Шаг 2: pip-upgrade-outdated ... готовоshao.lo 23 окт.
  • Это действительно хороший пакет. Нуждается в большей огласке, я давно работаю на Python и впервые слышу об этом. Отлично! Mario Chapa 17 сен.
  • 1
    @MarioChapa Спасибо - я написал (по сути). Andrew Jaffe 19 августа в 14:13
12

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

for i in ` pip list | awk -F ' ' '{print $1}'`; do pip install --upgrade $i; done
1
  • это самый чистый и удобочитаемый способ обновления пакетов pip с максимальной краткостью. Отлично. Mark Shust at M.academy 28 окт.
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

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

1
  • 3
    Ваш ответ был изменен с yolkна yolk3k, в вашем исходном ответе определенно были проблемы с python3. AXO 19 дек.
12

Чистая оболочка Bash / Z для достижения этого:

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
2
  • 1
    Что означает <p %% = *>? ᐅdevrimbaris 9 июня '20 в 17:31
  • 2
    @ ᐅ devrimbaris удаляет спецификацию версии и оставляет только имя пакета. Вы можете увидеть это, запустив for p in $(pip list -o --format freeze); do echo "${p} -> ${p%%=*}"; done. В более общем смысле, ${haystack%%needle}значит delete longest match of needle from back of haystack. German Lashevich 10 июн.
12

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

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

pip freeze > requirements.txt

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

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

pip install -r requirements.txt --upgrade

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

1
  • Это просто работает. Просто сделайте pip freeze > requirements.txtпотом, чтобы увидеть фактическую разницу. aggsol 9 марта в 10:09
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-except просто пропускает пакеты, удаленные из PyPI.

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

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

Использовать:

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

Одна строка в PowerShell 5.1 с правами администратора, Python 3.6.5 и pip версии 10.0.1:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

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

9

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

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
2
  • @Enkouyami в Windows 7 эта команда не работает без -r. -r должен исключать путь к файлу требований. Chockomonkey 16 июля '18 в 21: 452018-07-16 21:45
  • 1
    В каком контексте? CMD? PowerShell ? Cygwin ? Анаконда ? Что-то другое? Peter Mortensen 06 окт.
9

Отправлено через пул-реквест сотрудникам pip ; тем временем используйте это решение библиотеки 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
1
9

Мне показалось, что это сработало ...

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

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

8

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

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