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

avatar
thedjpetersen
27 апреля 2010 в 09:23
1429461
50
2336

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

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

Источник
Colonel Panic
22 мая 2013 в 13:01
50

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

Cyberwiz
24 февраля 2021 в 15:33
1

Если вы хотите обновить один пакет и все его зависимости (возможно, более разумный подход), сделайте следующее: pip install -U --upgrade-strategy eager your-package

Xeнεi Ξэnвϵς
7 марта 2021 в 05:11
3

Я использую PowerShell 7, и в настоящее время я использую этот однострочник: pip list --format freeze | %{pip install --upgrade $_.split('==')[0]} (я пока не могу опубликовать здесь ответ)

Ответы (50)

avatar
rbp
10 августа 2010 в 19:56
2536

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

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

rbp
12 августа 2011 в 08:40
67

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

Jabba
13 сентября 2011 в 04:11
24

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

jawache
25 апреля 2012 в 12:57
1

Spot on - добавлено исключение в grep, чтобы игнорировать редактируемые пакеты. замораживание пипсов - местное | grep -v "\ -e" | вырезать -d = -f 1 | xargs pip install -U

Piotr Dobrogost
20 октября 2012 в 10:06
1

rbp, не могли бы вы включить в свой ответ улучшение @jawache?

rbp
22 октября 2012 в 13:25
2

@PiotrDobrogost Я старался не усложнять. Но, что ж, имеет смысл. Я включил его (с небольшим исправлением: я закрепил регулярное выражение в начале имени пакета, чтобы не исключать такие пакеты, как "<something> -e <something else>".

LasseValentini
5 марта 2013 в 14:29
8

Как насчет изменения grep на: egrep -v '^ (\ - e | #)' (я получаю эту строку при запуске в ubuntu 12.10: «## FIXME: не удалось найти URL-адрес svn в dependency_links для этого пакета:».

Chris Krycho
6 мая 2013 в 03:34
2

Вы также можете просто использовать sed для более простой строки, например. (и это не касается всего, что вы включили, но в принципе легко могло): pip freeze --local | sed 's/==.*//' | xargs pip install -U.

schemacs
14 ноября 2013 в 13:59
1

Как насчет этого pip freeze --local | grep -v '^ \ - e' | вырезать -d = -f 1 | xargs -i bash -c 'pip install -U {} || : ' для предотвращения выхода при ошибке?

Emil H
4 марта 2014 в 06:29
35

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

rbp
7 марта 2014 в 11:05
1

@EmilH есть бесконечные возможности улучшить или настроить это :) Я не буду добавлять ваше предложение к ответу, чтобы он был простым (насколько это возможно). Но хороший, спасибо :)

andsens
20 октября 2014 в 13:22
6

Если по какой-то причине pip выходит из строя посреди всего этого (т. Е. Пакет больше не существует), вы можете добавить -n1 к xargs, это заставит его передавать только один аргумент за раз для pip, в противном случае pip завершает работу при первом ошибка.

Crawford Comeaux
12 февраля 2015 в 10:56
1

@andsens Есть ли причина не использовать -n1? Похоже, имеет смысл включить его по умолчанию ...

andsens
12 февраля 2015 в 11:40
1

@CrawfordComeaux Нет, я не могу вспомнить :-)

Utkonos
2 марта 2015 в 20:04
4

Следующее заклинание обновлено для использования списка пунктов - устарело. Он игнорирует любые сообщения об ошибках и предупреждения и не принимает их во внимание. pip list --outdated | grep -G '(Current.*)' | sed 's/ (Current.*//' | xargs -n 1 sudo pip install --upgrade

rbp
4 марта 2015 в 14:13
1

@ richard-bronosky Я отменил вашу правку, хотя она была совершенно верной и, вероятно, даже хорошей идеей. Как я уже упоминал ранее, существует бесконечное количество вариантов этого решения, и я стараюсь, чтобы оно было простым и настолько коротким, насколько это разумно. Для справки, решение Ричарда было: pip freeze --local | тройник before.pip.txt | grep -v '^ \ - e' | вырезать -d = -f 1 | xargs -n1 pip install -U (то есть, включая «tee» для создания файла «before.pip.txt» с содержимым «pip freeze» перед обновлением)

Bruno Bronosky
4 марта 2015 в 15:19
3

@rbp, это честно. У меня есть несколько предложений, поскольку целью является код-гольф. (Вы сказали «просто и настолько коротко, насколько это разумно»). Вместо использования grep & cut по конвейеру, вы можете сохранить процесс и символы с помощью одного инструмента. Сохраните 3 символа с помощью awk pip freeze --local | awk -F = '!/^-e/{print $1}' | xargs -n1 pip install -U или 10 символов с помощью sed pip freeze --local | sed '/^-e/d;s/=.*//' | xargs -n1 pip install -U.

proski
8 апреля 2015 в 14:44
2

Пакеты, установленные пользователем (т.е. те, которые находятся в ~ / .local), следует обрабатывать отдельно, иначе они будут заменены установками, не установленными пользователем. Это выглядит достойной задачей для Github Gist, пока pip не обновит все.

Luke Dupin
9 сентября 2015 в 22:23
2

Мне потребовалось добавить sudo к последнему элементу: pip freeze --local | grep -v '^ \ - e' | вырезать -d = -f 1 | sudo xargs -n1 установка пипса -

rbp
10 сентября 2015 в 16:20
1

@LukeDupin, если вы устанавливаете пакеты глобально, то да, вам это может понадобиться. Если вы используете virtualenv, в этом нет необходимости.

FredrikHedman
13 февраля 2016 в 12:10
2

Хороший пример пайпов, но я бы все равно использовал pip-review. Лучше простое, чем сложное;)

rbp
15 февраля 2016 в 09:42
1

@FredrikHedman Возможно, я никогда не использовал pip-review. Вы заметите, что этот ответ на старше, чем pip-review :)

Mario S
17 марта 2016 в 01:53
10

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

Ishayahu
5 декабря 2016 в 12:26
1

список пунктов - устарело | grep -v 'sqlite3 (0.0.0)' | вырезать -d '' -f 1 | xargs -n1 pip install -U (чтобы избежать обновления sqilte3)

vrleboss
4 марта 2017 в 00:46
0

Получение ошибок при выполнении указанной выше команды в OSX, этот ответ: coderhelper.com/a/25816730/2737316 решил проблему. то есть запустить: pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U --user

Flimm
8 марта 2017 в 08:45
1

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

John Jones
17 июля 2017 в 18:26
0

Есть ли причина не использовать xargs -P для распараллеливания обновлений?

Douglas Daseeco
31 августа 2017 в 12:01
0

Вывод трудно прочитать из-за устаревшего ответа. Отличный: coderhelper.com/questions/2720014/…

Tom Hale
4 октября 2017 в 13:05
0

Permission denied ... Есть ли способ предотвратить эту операцию с системными пакетами?

thebeancounter
30 октября 2017 в 12:38
0

Чтобы избавиться от проблемы с разрешением, вы можете немного изменить его на $ pip freeze --local | grep -v '^ \ - e' | вырезать -d = -f 1 | xargs -n1 sudo -H pip install -U

Dominik
14 ноября 2017 в 14:45
1

@rbp Проблема № 59 закрыта и ссылки на команду upgrade-all № 4551, которая зависит от еще не реализованного преобразователя зависимостей № 988

Morse
2 апреля 2018 в 15:24
0

Это исчерпывающе, он запускает --upgrade на всех пакетах, пустая трата времени, мы бы обновили те, которые уже устарели.

glen
3 апреля 2018 в 04:42
2

@pradyunsg, добавьте xargs -r, чтобы предотвратить запуск команд обновления, если обновлять нечего! :)

Fiddy Bux
10 апреля 2018 в 10:11
1

Для обновления для вошедшего в систему пользователя (поэтому не требуется sudo): pip3 freeze --local | grep -v '^ \ - e' | вырезать -d = -f 1 | xargs -n1 pip install --user -U

Giancarlo Sportelli
13 апреля 2018 в 08:33
0

Другая причина использовать pip list --outdated --format=freeze вместо pip freeze --local заключается в том, что последний не обновляет сам pip, если это необходимо.

Stevoisiak
26 апреля 2018 в 14:52
2

Ошибка в Windows 7: 'grep' is not recognized as an internal or external command, operable program or batch file.

Timo
30 апреля 2018 в 06:13
0

Почему «xargs»?

AXO
30 ноября 2018 в 02:42
1

pip 10 добавил параметр --exclude-editable. pip.pypa.io/en/stable/news/#id30

Douglas Daseeco
9 января 2019 в 08:17
0

При использовании этой команды вывод может быть неоднозначным. Для более удобочитаемого вывода используйте вместо этого: coderhelper.com/questions/2720014/…

Qin Heyang
29 марта 2019 в 20:15
2

В Python 3 будет ошибка TypeError: '>' not supported between instances of 'Version' and 'Version'

rbp
1 апреля 2019 в 09:28
0

@QinHeyang Я не понимаю. Командная строка ответа запускается на bash. Если вы получаете эту ошибку, это связано с pip.

wundermahn
21 мая 2020 в 10:29
0

Кто-нибудь понял, как это сделать на винде?

Hemil
27 мая 2020 в 07:57
0

Кажется, есть ошибка в текущей версии pip, о которой я сообщил здесь: github.com/pypa/pip/issues/8331. Когда я запускаю эту команду, добавляется pkg_resources == 0.0.0. Опущено -U в установке pip, похоже, работает

philshem
6 июля 2020 в 09:53
0

pip указывал себя как устаревший, что нарушало мою установку brew. помогает удаление pip из списка пакетов для обновления: pip list --outdated --format=freeze | grep -v "pip=="| grep -v '^\-e' | cut -d = -f 1 | grep -v pip | xargs -n1 pip install -U. Конечно, если другой пакет заканчивается на «pip», он тоже не будет обновляться :)

Omglolyes
11 августа 2020 в 09:34
0

По состоянию на август 2020 года это дает мне много сообщений типа ERROR: After October 2020 you may experience errors when installing or updating packages. This is because pip will change the way that it resolves dependency conflicts., есть ли способ перейти на зависимости вместе с фактическим модулем?

Isaac Saffold
22 августа 2020 в 23:46
1

pip list имеет параметр --not-required, который исключает пакеты, которые являются зависимостями других установленных пакетов.

Karsus
23 августа 2020 в 11:11
1

@Omglolyes Получил ту же ошибку. Добавлен --use-feature=2020-resolver в конце команды, и это решило проблему.

Boris
31 августа 2020 в 16:05
0

Похоже, что в Ubuntu это также «обновляет» старую версию distro-info, которая ломает do-release-upgrade. См. Этот вопрос AskUbuntu askubuntu.com/questions/1182208/…

Timo
23 ноября 2020 в 08:45
0

Зачем показывать команду для более старых версий pip, она все еще используется? Должен ли я использовать старую версию pip?

Tomer
16 декабря 2020 в 03:29
0

Версия Python3: pip3 list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip3 install -U

Timo
31 декабря 2020 в 09:51
0

Что делает grep -v '^ \ - e'? Ах, прочтите сначала весь пост!

Timo
31 декабря 2020 в 09:56
0

xargs: pip: Нет такого файла или каталога в Ubuntu 20_04 в pip 20.0.2 и python 3.8

Isaac Saffold
26 января 2021 в 11:48
0

Недавно я обнаружил, что pip list имеет параметр --user, который ограничивает вывод пакетов сайта пользователя. Это позволяет избежать использования информации о дистрибутиве в Ubuntu, что может вызвать серьезные проблемы.

John Tate
3 мая 2021 в 18:25
0

Это перестало работать и теперь выдает ошибку TypeError.

Scrooge McDuck
30 мая 2021 в 03:41
0

осторожно используйте это, потому что это, вероятно, переопределит ваши пакеты python для распространения

Swapnadeep Mukherjee
17 июля 2021 в 16:06
0

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U --user - Это тоже полезная команда.

Marco Pagliaricci
1 августа 2021 в 09:05
0

Как насчет добавления -r в xargs, чтобы он вообще не запускал pip -U , если нет устаревших пакетов? Я нашел это полезным, иначе я бы получил раздражающее сообщение ERROR: You must give at least one requirement to install (see "pip help install"), если бы набрал эту команду в некоторой среде без устаревших пакетов. ПРИМЕЧАНИЕ: похоже, что параметр -r для xargs является расширением GNU. Наслаждаться!

avatar
Isaque Elcio
11 февраля 2021 в 02:24
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/

aggsol
9 марта 2021 в 10:09
0

Это просто работает. Просто сделайте pip freeze > requirements.txt потом, чтобы увидеть реальную разницу.

avatar
Sina Majidi
31 декабря 2020 в 21:31
1

, чтобы обновить все пакеты по умолчанию в вашей версии Python по умолчанию, просто запустите нижний код Python в терминале или в командной строке:

import subprocess
import re


pkg_list = subprocess.getoutput('pip freeze')

pkg_list = pkg_list.split('\n')


new_pkg = []
for i in pkg_list:
    re.findall(r"^(.*)==.*", str(i))
    new = re.findall(r"^(.*)==.*", str(i))[0]
    new_pkg.append(new)

for i in new_pkg:
    print(subprocess.getoutput('pip install '+str(i)+' --upgrade'))

avatar
extreme4all
14 декабря 2020 в 19:09
1

для сценария летучей мыши

call pip freeze > requirements.txt
call powershell "(Get-Content requirements.txt) | ForEach-Object { $_ -replace '==', '>=' } | Set-Content requirements.txt"
call pip install -r requirements.txt --upgrade
avatar
Justin Lee
15 октября 2019 в 02:39
6

Вот код для обновления всех пакетов Python 3 (в активированном virtualenv) через pip:

import pkg_resources
from subprocess import call

for dist in pkg_resources.working_set:
    call("python3 -m pip install --upgrade " + dist.project_name, shell=True)

avatar
Andy
10 августа 2019 в 02:59
5

Приведенный ниже фрагмент кода Windows cmd выполняет следующие действия:

  • Обновляет pip до последней версии.
  • Обновляет все устаревшие пакеты.
  • Для каждого обновляемого пакета проверяет requirements.txt на наличие спецификаторов версии.
@echo off
Setlocal EnableDelayedExpansion
rem https://coderhelper.com/questions/2720014/

echo Upgrading pip...
python -m pip install --upgrade pip
echo.

echo Upgrading packages...
set upgrade_count=0
pip list --outdated > pip-upgrade-outdated.txt
for /F "skip=2 tokens=1,3 delims= " %%i in (pip-upgrade-outdated.txt) do (
    echo ^>%%i
    set package=%%i
    set latest=%%j
    set requirements=!package!

    rem for each outdated package check for any version requirements:
    set dotest=1
    for /F %%r in (.\python\requirements.txt) do (
        if !dotest!==1 (
            call :substr "%%r" !package! _substr
            rem check if a given line refers to a package we are about to upgrade:
            if "%%r" NEQ !_substr! (
                rem check if the line contains more than just a package name:
                if "%%r" NEQ "!package!" (
                    rem set requirements to the contents of the line:
                    echo requirements: %%r, latest: !latest!
                    set requirements=%%r
                )
                rem stop testing after the first instance found,
                rem prevents from mistakenly matching "py" with "pylint", "numpy" etc.
                rem requirements.txt must be structured with shorter names going first
                set dotest=0
            )
        )
    )
    rem pip install !requirements!
    pip install --upgrade !requirements!
    set /a "upgrade_count+=1"
    echo.
)

if !upgrade_count!==0 (
    echo All packages are up to date.
) else (
    type pip-upgrade-outdated.txt
)

if "%1" neq "-silent" (
    echo.
    set /p temp="> Press Enter to exit..."
)
exit /b


:substr
rem string substition done in a separate subroutine -
rem allows expand both variables in the substring syntax.
rem replaces str_search with an empty string.
rem returns the result in the 3rd parameter, passed by reference from the caller.
set str_source=%1
set str_search=%2
set str_result=!str_source:%str_search%=!
set "%~3=!str_result!"
rem echo !str_source!  !str_search!  !str_result!
exit /b
Andy
10 марта 2020 в 08:22
1

@ConCast Рад, что вам понравилось! Я только что обновил фрагмент до последней версии, которую использую.

JosefZ
20 марта 2020 в 20:17
0

for /F "skip=2" %G in ('pip list --outdated') do pip install %G --upgrade тоже должен сработать, однако предшествующий python -m pip install --upgrade pip неплохая идея :)

avatar
Alex
6 марта 2019 в 14:44
5

A JSON + jq ответ:

pip list -o --format json | jq '.[] | .name' | xargs pip install -U
avatar
Achilles Gasper Rasquinha
16 января 2019 в 01:26
216

Используйте 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+.

Enter image description here

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

Gaia
27 января 2019 в 16:52
2

Этот метод имеет гораздо более чистый результат, чем ответ @ rbp

CGFoX
22 марта 2019 в 06:46
9

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

Achilles Gasper Rasquinha
22 марта 2019 в 14:09
0

@CGFoX Не могли бы вы открыть вопрос на странице репо? Таким образом мы сможем диагностировать это.

Achilles Gasper Rasquinha
10 мая 2019 в 16:34
0

@CGFoX Я считаю, что это было исправлено в 1.5.0

Chris
29 мая 2019 в 17:11
1

Только что установил и тоже застрял при проверке [0;93mChecking...[0m

Achilles Gasper Rasquinha
6 июня 2019 в 07:22
0

@Chris @CGFoX Попробуйте удалить pip-кеш ~/.cache/pip и ~/Library/Caches/pip (в macOS)

Achilles Gasper Rasquinha
6 июня 2019 в 08:58
0

Это добавлено как известная проблема - github.com/achillesrasquinha/pipupgrade/issues/30

nathandrake
13 июля 2019 в 15:07
0

~ $ pipupgrade --latest --yes -bash: pipupgrade: команда не найдена

Achilles Gasper Rasquinha
15 июля 2019 в 16:50
1

@nathandrake хотите открыть проблему на странице проблем?

Carlos
23 июля 2019 в 14:11
0

@AchillesGasperRasquinha - оффтоп, а какое это терминальное приложение? и какую цветовую схему вы используете? Не возражаете экспортировать это?

Achilles Gasper Rasquinha
30 августа 2019 в 04:48
0

@Carlos - это zsh с космической тематикой.

Qin Heyang
13 ноября 2019 в 03:55
2

Получил ошибку в Windows 10 и Python 3.7.5: ModuleNotFoundError: No module named 'ctypes.windll'

Achilles Gasper Rasquinha
9 января 2020 в 23:01
0

@QinHeyang это было исправлено недавно.

Johannes
1 февраля 2020 в 15:25
0

Какой терминал вы используете?

Gerd
16 марта 2020 в 10:46
1

Кажется, есть проблемы: Checking... 2020-03-16 11:37:03,587 | WARNING | Unable to save package name. UNIQUE constraint failed: tabPackage.name 2020-03-16 11:37:13,604 | WARNING | Unable to save package name. database is locked 2020-03-16 11:37:13,609 | WARNING | Unable to save package name. database is locked

Gugu72
23 марта 2020 в 14:24
0

Кажется, возникла проблема: pipupgrade.exception.PopenError: Command 'C:\Program Files (x86)\Python37-32\Scripts\pip.exe --version' returned non-zero exit status 1.

Achilles Gasper Rasquinha
4 июня 2020 в 16:10
0

@Gerd, не могли бы вы открыть проблему с исходным репозиторием?

Achilles Gasper Rasquinha
4 июня 2020 в 16:10
0

@ Gugu72 Не могли бы вы открыть проблему с исходным репозиторием?

Gugu72
4 июня 2020 в 17:08
0

Это довольно давно, но я посмотрю, сохраняется ли проблема. Не могли бы вы прислать мне ссылку репо?

Bob Denny
17 июля 2020 в 23:41
0

Для установки raspberry Pi Jessie требуется sudo pip

Achilles Gasper Rasquinha
19 ноября 2020 в 17:02
0

@ Gugu72 github.com/achillesrasquinha/pipupgrade

user202729
12 января 2021 в 02:57
0

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

Achilles Gasper Rasquinha
14 января 2021 в 15:57
0

@ user202729 вы не можете использовать флаг --latest, поскольку он обновляет зависимости, которые могут нарушить изменение.

CalfCrusher
9 августа 2021 в 02:14
0

@AchillesGasperRasquinha такой фантастический инструмент!

avatar
German Lashevich
29 ноября 2018 в 10:31
12

Чистый Bash / Z shell однострочник для достижения этого:

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
ᐅdevrimbaris
9 июня 2020 в 17:31
1

Что означает <p %% = *>?

German Lashevich
10 июня 2020 в 12:15
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.

avatar
Muhammad Usman
19 июля 2018 в 06:41
5

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

 pip list --outdated --format=columns

Установить

 sudo pip install pipdate

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

 sudo -H pipdate
avatar
Sébastien Wieckowski
25 июня 2018 в 11:56
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}

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

avatar
Ankireddy
23 апреля 2018 в 07:06
9

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

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Chockomonkey
16 июля 2018 в 21:45
0

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

Peter Mortensen
6 октября 2020 в 22:28
1

В каком контексте? CMD? PowerShell? Cygwin? Анаконда? Что-то другое?

avatar
adrin
13 апреля 2018 в 11:24
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
shao.lo
23 октября 2018 в 22:55
2

Шаг 1: pip install pip-upgrade-outdated Шаг 2: pip-upgrade-outdated ... готово

Mario Chapa
17 сентября 2020 в 05:37
0

Это действительно хороший пакет. Нуждается в большей огласке, я давно работаю на Python и впервые слышу об этом. Отлично!

Andrew Jaffe
19 августа 2021 в 14:13
1

@MarioChapa Спасибо - я написал (по сути).

avatar
keypress
5 апреля 2018 в 11:00
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
avatar
Ilya
12 января 2018 в 14:33
2

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

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

Итак,

pip check

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

avatar
JohnDHH
9 ноября 2017 в 09:19
17

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

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

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

foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
Jimmy MG Lim
3 апреля 2019 в 07:48
0

А для python 3 ... pip3 install -U $ (pip3 freeze | awk -F '[=]' '{print $ 1}')

avatar
thebeancounter
30 октября 2017 в 12:44
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, который позволяет команде запускаться с правами суперпользователя.

Manu CJ
20 ноября 2017 в 16:47
0

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

avatar
Alexandre Huat
5 октября 2017 в 21:41
1

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

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

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

avatar
user8598996
12 сентября 2017 в 16:50
10

Использование:

pip install -r <(pip freeze) --upgrade
avatar
RedEyed
28 августа 2017 в 13:49
23

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

pip install pipdate
pipdate

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

Serge Stroobandt
10 мая 2018 в 20:14
3

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

VladoPortos
11 августа 2020 в 08:42
0

проголосовать за это, отлично работает в окнах

Joseph Konan
28 августа 2020 в 22:22
1

Я использовал pipdate и теперь не могу найти pip или python. Используйте на свой риск.

avatar
Achilles Gasper Rasquinha
23 августа 2017 в 06:19
0
python -c 'import pip; [pip.main(["install", "--upgrade", d.project_name]) for d in pip.get_installed_distributions()]'

Один лайнер!

avatar
Cando Zhou
19 июля 2017 в 12:13
1

Если вы используете macOS,

  1. убедитесь, что у вас установлен Homebrew
  2. установите jq, чтобы прочитать JSON, который вы собираетесь сгенерировать
brew install jq
  1. обновить каждый элемент в списке устаревших пакетов, созданных pip3 list --outdated
pip3 install --upgrade  `pip3 list --outdated --format json | jq '.[] | .name' | awk -F'"' '{print $2}'`
avatar
Nils Ballmann
4 июля 2017 в 13:49
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

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

avatar
Simion Agavriloaei
26 апреля 2017 в 18:43
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 в свою команду.

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

Nostalg.io
8 июня 2017 в 15:51
9

Это то, что pip должен делать по умолчанию.

Luke
12 июля 2017 в 12:43
0

с помощью вашего инструмента некоторые персонажи не работают правильно на моей машине с Windows, но в остальном все в порядке

Simion Agavriloaei
12 июля 2017 в 14:01
0

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

Morse
2 апреля 2018 в 15:15
0

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

Jordan
17 января 2019 в 16:41
0

Просто хотел, чтобы вы знали, что мне очень нравится поток pip-upgradeder. Для меня это сразу приобрело смысл. Спасибо!

cwhisperer
3 октября 2019 в 08:56
2

Это также работает с папкой требований, содержащей общие требования, требования для разработчиков и продуктов. Просто здорово!

avatar
Douglas Daseeco
20 февраля 2017 в 00:45
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 Oddity

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

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

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

  • Проблемы с переносимостью из-за изменения функций командной строки pip
  • Сбой xargs из-за общих сбоев дочерних процессов pip или pip3
  • Переполненное ведение журнала из необработанного xargs вывода
  • Использование моста Python-OS при его возможном обновлении 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, может быть потенциальной причиной тупиковой ситуации или повреждения базы данных пакетов.

Walter Tross
9 января 2019 в 07:33
3

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

Douglas Daseeco
9 января 2019 в 08:13
0

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

avatar
kichik
16 февраля 2017 в 01:38
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 ...
avatar
Mo Ali
9 февраля 2017 в 19:22
3
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)

Я взял ответ Раманы и сделал его дружественным к pip3.

avatar
Steve Barnes
9 февраля 2017 в 17:23
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)

Работает быстро, так как не запускает оболочку постоянно.

gerrit
16 июня 2017 в 15:36
0

Действительно ли постоянный запуск оболочки имеет ощутимое значение, когда мы в конечном итоге загружаем пакеты из pypi с последующей (компиляцией и) установкой?

Steve Barnes
17 июня 2017 в 04:35
0

@gerrit По моему опыту, да, это так, особенно в среде, где у вас есть агрессивное антивирусное программное обеспечение, которое вы не можете выключить. Там, где я работаю, мы не можем отключить или подавить антивирус, и каждый запуск оболочки занимает 20-30 секунд, но в хорошие дни у нас действительно быстрое интернет-соединение. Когда вы устанавливаете большие пакеты, время установки может быть значительным, но когда вы устанавливаете намного меньший пакет, время запуска оболочки очень важно.

avatar
Storm Shadow
4 ноября 2016 в 11:34
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)
Jan Schnupp
24 ноября 2018 в 09:22
0

К сожалению, это больше не работает. pip --format не принимает "устаревший" вариант. По крайней мере, не в моей версии Python.

Storm Shadow
27 февраля 2019 в 21:49
0

@Rocketq Какое неправомерное заявление, он делает именно то, что делают 50-100 других примеров в этой ветке. Я думаю, что вы тролль, так как обновление пакетов python не может уничтожить ваш компьютер

Rocketq
28 февраля 2019 в 07:58
0

@StormShadow, как вы надеетесь, знаете, pip действительно плохо контролирует зависимости. он работает точно так же, как и другое решение - да ((Лучше добавить отказ от ответственности

avatar
Apeirogon Prime
16 сентября 2016 в 09:07
20

Решение Windows PowerShell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Foad
22 мая 2019 в 08:38
0

pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?

brainplot
3 января 2020 в 05:06
3

Возможно, pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_} будет более подходящим.

avatar
Shihao Xu
10 июня 2016 в 03:47
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

Reman
26 ноября 2016 в 14:01
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.

AlessioX
17 декабря 2016 в 20:11
2

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

AlessioX
17 декабря 2016 в 20:12
0

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

avatar
user1175849
1 июня 2016 в 07:39
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

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

AXO
19 декабря 2016 в 19:41
3

Ваш ответ был изменен с yolk на yolk3k, в вашем исходном ответе определенно были проблемы с python3.

avatar
Copperfield
11 апреля 2016 в 23:07
4

Вот еще один способ сделать со скриптом на 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])
avatar
azazelspeaks
12 ноября 2015 в 09:20
378

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

Сделать

$ pip freeze > requirements.txt

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

$ 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

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

youngminz
15 мая 2016 в 05:28
32

Вам следует удалить requirements.txt =={version}. Например: от python-dateutil==2.4.2 до python-dateutil для всех строк.

jkooker
8 марта 2017 в 14:42
5

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

Amaury Liet
16 марта 2017 в 11:12
12

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

alex
7 апреля 2017 в 04:41
0

Это именно то, что я хотел. У меня есть python virtualenv, и мне нужно было поддерживать его в актуальном состоянии. Он обновил все существующие пакеты в файле requirements.txt.

tombolinux
10 декабря 2017 в 08:26
0

Хотя мне очень нравится решение jfs с pip-review, это решение дает вам гибкость, чтобы легко выбрать, что вы хотите обновить или нет. @ Amaury-Liet хороший улов!

Cavaz
14 января 2018 в 18:22
8

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

Sergiy Kolodyazhnyy
3 сентября 2018 в 22:17
2

Если оболочка, которую вы используете, - это bash, вы можете сократить ее до одной команды с помощью pip3 install -r <(pip3 freeze) --upgrade. Фактически, <(pip3 freeze) - это анонимный канал, но он будет действовать как файловый объект.

Sergiy Kolodyazhnyy
3 сентября 2018 в 22:26
0

И в случае, если он не работает на одном пакете, вы можете сделать это xargs -L 1 -a <(pip3 freeze) pip3 install --upgrade

Daniel
9 февраля 2020 в 16:34
0

У меня работает в Ubuntu 16.04 (с модификацией @Cavaz): $ pip freeze | cut -d '=' -f1> reqs, а затем я открываю файл и комментирую cytoolz (используя #), что вызывало ошибки; наконец $ pip install -r reqs --upgrade.

whatacold
13 июня 2020 в 14:00
0

Объедините приведенные выше комментарии, этот однострочный pip3 install -r <(pip3 freeze | cut -d '=' -f1) --upgrade работает на Bash.

Timo
23 ноября 2020 в 12:11
0

Поскольку этот ответ относится к Windows, вот попытка PS: $pfr=$(pip freeze > requirements.txt) $pfr=$pfr.split('='). Ошибка WARNING: Could not generate requirement for distribution -p 20.2.3 (c:\python39\lib\site-packages): Parse error at "'-p==20.2'": Expected W:(abcd...)

avatar
SaxDaddy
5 августа 2015 в 22:20
9

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

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

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

avatar
Marc
21 ноября 2014 в 23:15
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 действительно может обрабатывать пропуск записи ).

Boris
11 ноября 2018 в 14:19
0

Если одно обновление не удается, никакие обновления не выполняются.

avatar
Alex V
9 октября 2014 в 14:23
8

Это должно быть более эффективным:

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

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

Alex V
15 ноября 2014 в 09:30
0

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

DrStrangepork
17 ноября 2014 в 22:30
0

Комментарии плохо форматируются, но вот фрагмент (окончания строк отмечены знаком ";"): # 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;

antibus
20 февраля 2015 в 08:33
0

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

Six
20 апреля 2016 в 22:45
1

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

avatar
raratiru
7 марта 2014 в 20:25
69

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

(пункт> 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
Chip Camden
13 августа 2015 в 23:03
0

Пришлось добавить фильтры для строк, начинающихся с «Could» и «Some», потому что, по-видимому, pip отправляет предупреждения на stdout :(

raratiru
3 ноября 2015 в 00:31
0

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

Jens
9 декабря 2015 в 21:15
14

Или: pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade

avatar
antibus
3 марта 2014 в 08:32
4

Я пробовал код Раманы и обнаружил, что в Ubuntu вы должны писать sudo для каждой команды. Вот мой сценарий, который отлично работает на 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)
avatar
Samuel Marks
26 января 2014 в 09:31
9

отправил через запрос на вытягивание людям; тем временем используйте это решение библиотеки 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
Samuel Marks
27 апреля 2015 в 05:39
0

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

avatar
何宗翰
17 июля 2013 в 01:43
12

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

for i in ` pip list | awk -F ' ' '{print $1}'`; do pip install --upgrade $i; done
Mark Shust at M.academy
28 октября 2013 в 12:41
0

это самый чистый и удобочитаемый способ обновления пакетов pip с максимальной краткостью. Отлично.

avatar
Salman von Abbas
22 мая 2013 в 12:42
29

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

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
Maximiliano Rios
27 мая 2014 в 19:50
5

subprocess.call ("sudo pip install ... если вам нужны разрешения

Bengt
20 февраля 2016 в 15:28
4

@MaximilianoRios Пожалуйста, не sudo pip install, используйте вместо этого виртуальный env.

avatar
jfs
29 апреля 2013 в 00:34
712

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

hauzer
25 апреля 2014 в 00:23
0

NameError: name 'raw_input' is not defined - Для меня сломано.

jfs
25 апреля 2014 в 00:27
2

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

Wernight
22 июля 2014 в 08:50
7

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

smaudet
13 ноября 2014 в 20:30
0

Прекрасно работает с mingw. Почему вы используете CMD в Windows, если вы также используете Python?

jfs
1 декабря 2014 в 16:49
1

@Wernight: если вы не можете установить дополнительные пакеты Python, вам не нужен pip-review (это автоматизирует установку новых версий для вас). Другими словами, если вы находитесь в среде, где имеет смысл использовать инструмент pip-review, вы также можете позволить себе его установить.

Wernight
2 декабря 2014 в 14:16
0

@ J.F.Sebastian Да, pip-review предназначен для обновления и замораживания зависимостей. Я имел в виду, что в одном dev-requirements.txt будет pip-review. Он может стать частью PIP.

PTBNL
28 апреля 2015 в 15:22
1

@julianz: Есть pip-toos-win, хотя я не пробовал.

ziyuang
1 мая 2015 в 08:52
0

Как обновить материал для Python 3? По умолчанию этого не происходит.

jfs
1 мая 2015 в 21:24
0

@ziyuang создайте новый виртуальный сервер с использованием версии Python 3 и установите необходимые пакеты (pip-dump может помочь вам сохранить файл требований). См. Обновить python в virtualenv

Daniel
12 октября 2015 в 04:21
1

Если это больше не работает, не следует ли отредактировать это в ответ, поскольку многие люди не читают комментарии?

jfs
12 октября 2015 в 06:00
2

@Daniel: pip-tools больше не работает, pip-review (вилка pip-tools) работает.

FredrikHedman
13 февраля 2016 в 12:13
7

pip-review работает нормально (по крайней мере, для Python версии 3.5.0)

Julian
9 октября 2016 в 23:38
1

pip-review должен работать под Windows начиная с версии 0.5 (pypi.python.org/pypi/pip-review/0.5). В противном случае отправьте заявку на github.com/jgonggrijp/pip-review/issues.

Tom Hale
4 октября 2017 в 13:12
1

Чтобы пропустить системные пакеты: pip-review --auto --user

Dlamini
21 мая 2018 в 01:07
23

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

Douglas Daseeco
9 января 2019 в 08:18
0

При использовании этой команды вывод может быть неоднозначным. Для более удобного чтения используйте вместо этого: coderhelper.com/questions/2720014/…

Qin Heyang
13 ноября 2019 в 04:03
0

В Windows используйте python.exe -m pip_review вместо pip-review. (обратите внимание на подчеркивание вместо тире)

Gerd
16 марта 2020 в 10:42
0

pip-review --local --interactive, похоже, не работает: Полный вывод (5 строк): Отслеживание (последний вызов последним): файл "<string>", строка 1, в <module> File "/ tmp / pip -install-ikq9nwd2 / onedrivesdk / setup.py ", строка 9, в <module> с open (NOTICE, 'r', encoding = 'utf-8') как f: NotADirectoryError: [Errno 20] Not a directory: ' /tmp/pip-install-ikq9nwd2/onedrivesdk/setup.py/../NOTICE.rst '---------------------------- ------------ ОШИБКА: ошибка команды со статусом выхода 1: python setup.py egg_info Проверьте журналы на предмет полного вывода команды.

jfs
16 марта 2020 в 16:28
0

@Gerd: похоже, проблема с пакетом onedrivesdk не связана с pip-review.

avatar
chbrown
27 октября 2012 в 22:56
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.

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

drevicko
13 января 2013 в 04:31
0

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

avatar
tkr
3 апреля 2012 в 21:38
28

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

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

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

$ sudo pip install -U yolk
Boris
29 июля 2019 в 06:33
2

Последний коммит 7 лет назад

dotbit
10 декабря 2019 в 19:09
0

в 2013 году нашей эры

avatar
Piotr Dobrogost
25 февраля 2012 в 18:04
141

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

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
Refael Ackermann
19 апреля 2016 в 19:30
24

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

Piotr Dobrogost
17 января 2017 в 09:22
3

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

Refael Ackermann
18 января 2017 в 14:25
0

@PiotrDobrogost, если мы хотим это тщательно проанализировать;) пусть n будет количеством установленных пакетов, а m <= n количеством "устаревших" пакетов. ваш будет раскручивать pip для ВСЕХ пакетов для 1 + n выполнения pip с n*log(n) веб-поиском версий и всех зависимостей, а также m загрузками и установками. Мой будет выполнять n поиск в Интернете для вызова --outdated, а затем будет запускать только m pip вызовы с m*log(n) поиском в Интернете для зависимостей + m загрузка и установка. for if m << n я выигрываю :)

Piotr Dobrogost
18 января 2017 в 14:38
3

@RefaelAckermann Вращение pip на порядок быстрее, чем проверка версии пакета по сети, поэтому нужно оптимизировать именно количество проверок, а не количество запусков. Моя делает n проверок, ваша - n + m проверок.

MacItaly
20 июня 2019 в 17:44
2

+1 - Сейчас 20.06.2019, я использую Python 3.7.3 в WIndows 10, и это был лучший способ обновить все мои локальные пакеты.

Andy
13 июля 2019 в 08:15
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.

αԋɱҽԃ αмєяιcαη
23 апреля 2020 в 23:46
0

@PiotrDobrogost Я пробовал ваше решение для Windows 10, но оно не работает. вот экран печати

Amit Naidu
29 апреля 2020 в 22:48
1

@ αԋɱҽԃαмєяιcαη это для cmd.exe, где встроена команда for. Это не для PowerShell, где было бы лучше использовать встроенную конструкцию цикла. Если вы все еще хотите использовать это решение в PowerShell, вам необходимо явно вызвать cmd.exe: cmd /c "for /F ""delims==="" %i in ('pip freeze -l') do pip install -U %i"

avatar
brunobord
13 сентября 2011 в 09:42
24

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

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
avatar
janrito
10 июня 2011 в 12:50
74

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

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Jeremy Blanchard
28 марта 2012 в 19:46
14

Внутри virtualenv я делаю это так: pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

Jacktose
28 октября 2016 в 18:22
0

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

Hugues
12 марта 2021 в 15:55
3

@Jacktose Я думаю, вы имели в виду python -m pip list --outdated.

avatar
Tobu
24 мая 2011 в 10:58
5

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

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

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

avatar
user515656
30 апреля 2011 в 03:31
748

Вы можете использовать следующий код 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)
Alex Gray
31 декабря 2011 в 04:13
24

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

endolith
6 марта 2012 в 16:18
54

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

Piotr Dobrogost
20 октября 2012 в 10:07
1

@aspinei См. мой ответ для Windows-версии сценария оболочки.

Josh K
29 апреля 2013 в 21:54
6

Я обернул это в fabfile.py. Спасибо!

user689383
18 июля 2013 в 10:25
1

Вопрос, будет ли это обновлять системные пакеты? (Запуск от root)? Если да, есть ли способ предотвратить это вместо использования virtualenv? Спасибо.

jeffcook2150
26 августа 2013 в 02:01
7

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

Josh
3 июня 2014 в 12:42
3

Поднимите вверх, выбранный ответ (выше) не сработает, если пакет больше не может быть найден. Этот сценарий просто продолжает следующие пакеты, замечательно.

Michael
1 июля 2014 в 17:35
0

Замечательно, что это можно запустить в Python! Если бы я хотел, чтобы он распечатал, был ли пакет успешно обновлен, как мне изменить этот скрипт?

Ian Kelling
20 сентября 2014 в 04:43
3

Это не работает и, возможно, мешает работе с общесистемными пакетами.

0xC0000022L
11 августа 2015 в 21:44
2

Должен быть принятый ответ. Возникла только одна проблема: если у вас есть две или более установки Python в вашей Windows, только одна может обновить пакеты. pip в данном случае - pip.exe Python "по умолчанию". Я изменил его на call("%s\\Scripts\\pip.exe install --upgrade %s" % (dirname(sys.executable), dist.project_name), shell=True), что, конечно, делает его непригодным для использования на платформах, отличных от Windows.

FundThmCalculus
12 октября 2016 в 12:41
0

Я надеюсь, что это функция, которая будет реализована в пакете pip. Просто функция pip.updateall() была бы идеальной.

Aminah Nuraini
22 февраля 2017 в 21:42
0

Странно, как pip не пишет флаг --upgrade в своей справке

nightuser
11 мая 2017 в 07:26
0

@AminahNuraini: Это так.

ArtificiallyIntelligence
11 июня 2017 в 18:16
0

pip freeze имеет много разрешений, запрещенных для меня, даже с sudo. этот ответ отлично решает мою проблему

Tom Hale
4 октября 2017 в 13:04
0

Permission denied ... Есть ли способ предотвратить эту операцию с системными пакетами?

Tomalak
19 ноября 2017 в 11:40
0

@TomHale Отметьте dist.location и соответствующим образом отфильтруйте список.

Ben Key
2 февраля 2018 в 06:05
0

Это работает с ActiveState ActivePython. Однако после этого, если вы попытаетесь запустить файл .py, полагаясь на ассоциацию файлов. Windows попытается снова запустить установщик ActiveState ActivePython.

anonymoose
3 августа 2018 в 16:03
1

Также обратите внимание, что этот сценарий завершается неудачно, если не удается установить один пакет (что случается с некоторыми расширениями C в Windows), в то время как предыдущая версия сценария продолжит обновление всего остального.

FranzHuber23
30 октября 2018 в 20:11
1

Лучший ответ здесь. Я создал суть на Github здесь: gist.github.com/SeppPenner/efc73891480b67c561aac7ba47df9df7

Douglas Daseeco
9 января 2019 в 08:18
0

При использовании этой команды вывод может быть неоднозначным. Для более удобочитаемого вывода используйте вместо этого: coderhelper.com/questions/2720014/…

Vasco Cansado Carvalho
25 июля 2020 в 14:26
1

Мне пришлось изменить последнюю строку на [call("pip install " + name + " --upgrade") for name in packages]

Timo
31 декабря 2020 в 10:42
0

@Josh fabric для ssh, если мне не нужен ssh, ваш fabfile тоже интересен? Я спрашиваю, потому что cmd ответа для pip> 10 не работает, я получаю сообщение об ошибке при импорте pkg_resources

Timo
31 декабря 2020 в 13:09
0

@ Джош fabfile не работает в pip> 10

Camilo Martinez M.
9 февраля 2021 в 20:41
0

Он работал у меня в Windows для pip> = 10.0.1, ничего не меняя.