Як оновити всі пакети Python за допомогою pip?


2049

Чи можливо оновити всі пакети Python одночасно pip?

Зверніть увагу : на цьому офіційному трекері випуску є запит на функцію.


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

Будьте обережні, виконуючи це, ви накручуєте pipустановку під час оновлення requests. Повідомлення про помилку є cannot import name IncompleteRead.
Пол Руні

11
Я перепробував купу відповідей і новий (і , отже , низький скоринг відповідь) виробляє набагато краще , вихід: stackoverflow.com/questions/2720014 / ...
FauChristian


Це питання є настільки старим і настільки корисним, я просто хочу попередити тих, хто зараз приїжджає сюди, що тепер є новий найкращий офіційний спосіб зробити все це: pipenv. Документи тут: docs.pipenv.org/basics та авторський Pycon 2018 про це говорять тут: youtube.com/watch?v=GBQAKldqgZs . Щасливого кодування!
Малик А. Румі

Відповіді:


2258

Ще немає вбудованого прапора, але ви можете використовувати його

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/isissue/59 . Але на кожну пропозицію, здається, відповідає "Так, але я занадто впевнений, чи X - це правильний спосіб зробити Y" ... Тепер краще, ніж ніколи? Практичність перемагає чистоту? :(
rbp

20
Він також друкує ті пакунки, які були встановлені за допомогою звичайного менеджера пакунків (наприклад, apt-get або Synaptic). Якщо я pip install -Uвиконаю це , він оновить усі пакети. Я боюся, що це може спричинити конфлікт з apt-get.
Джабба

8
Як щодо зміни grep на: egrep -v '^ (\ - e | #)' (я отримую цей рядок під час запуску його на ubuntu 12.10: "## FIXME: не вдалося знайти svn URL в залежності_посилання для цього пакета:".
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)

Для pip> = 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, якщо ви перебуваєте в ОС X!
Алекс Грей

52
Чи немає способу встановити за допомогою pip без виклику підпроцесу? Щось на кшталт import pip pip.install('packagename')?
ендоліт

6
Я загорнув це у fabfile.py . Дякую!
Josh K

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

3
Якщо цей палець вгору панує, обрана відповідь (вище) не вдається, якщо пакет більше не можна знайти. Цей сценарій просто продовжується до наступних пакетів, чудово.
Джош

642

Оновити всі локальні пакети; Ви можете використовувати pip-review:

$ pip install pip-review
$ pip-review --local --interactive

pip-reviewє виделкою pip-tools. Дивіться pip-toolsпроблему, згадану @knedlsepp . pip-reviewпакунок працює, але pip-toolsпакет більше не працює.

pip-reviewпрацює в Windows з версії 0.5 .


2
@hauzer: Він не підтримує Python 3. Хоча це може бути помилка
jfs

7
@mkoistinen Це хороший інструмент, але до його об'єднання в PIP це означає встановити щось додаткове, що може не кожен бажаючий зробити.
Wernight

2
@Daniel: pip-tools більше не працює, pip-review (fork of pip-tools) працює.
jfs

7
pip-review працює чудово (принаймні, для версії Python 3.5.0)
FredrikHedman

15
Щоб оновити все без інтерактивного режиму:pip-review --local --auto
Dlamini

333

Працює під Windows. Має бути добре і для інших. ($ - це будь-який каталог, у якому ви знаходитесь, у командному рядку. Наприклад, C: / Користувачі / Ім'я користувача>)

робити

$ pip freeze > requirements.txt

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

$ pip install -r requirements.txt --upgrade

Якщо у вас є проблеми з певним пакетом, який зупиняє оновлення (іноді нумерований), просто перейдіть до каталогу ($), прокоментуйте ім'я (додайте до нього #) та запустіть оновлення ще раз. Пізніше ви можете відмінити цей розділ назад. Це також чудово підходить для копіювання глобальних середовищ 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" для оновлення всіх пакетів; якщо одне оновлення не вдалося, запустіть його ще раз, і воно продовжиться на наступному.


29
Ви повинні видалити requirements.txt«S =={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 Ефективно, <(pip3 freeze)це анонімна труба, але вона буде виконувати функції файлового об’єкта
Сергій Колодяжний

128

Версія для Windows після консультації з чудовою документацією для FORRob van der 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 перевірятиме версії два рази, перший раз встановивши список застарілих пакетів та вдруге під час оновлення пакетів у цьому списку.
Пьотр Доброгост

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.
Енді

125

Використовуйте pipupgrade !

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

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

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

ПРИМІТКА: Я автор інструмента.


1
Цей метод має набагато чистіший результат, ніж відповідь @ rbp
Гая

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

1
Щойно встановив його, а також затримався при перевірці[0;93mChecking...[0m
Кріс

1
@nathandrake дбаєте відкрити випуск на сторінці проблем?
Ахілл Гаспер Раскінья

2
Помилка в Windows 10 та Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
Qin

74

Ви можете просто надрукувати застарілі пакети

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

14
Всередині virtualenv я це роблю так:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Джеремі Бланшард

Сьогодні ви також можете це зробити за допомогою python -m pip list outdated(хоча це не у форматі вимог).
Джектоз

74

Цей варіант мені здається більш простим і зрозумілим:

pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`

Пояснення полягає в тому, що pip list --outdatedвиводиться список усіх застарілих пакетів у такому форматі:

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

У команді awk NR>2пропускає перші два записи (рядки) і {print $1}вибирає перше слово кожного рядка (як це запропонував SergioAraujo, я видалив, tail -n +3оскільки awkдійсно може обробляти пропускні записи).


Якщо одне оновлення не вдається, жодна з оновлень не відбудеться.
Борис

2
ви можете уникнути хвостового awk 'NR>2 {print $1}'очищення результату для вас
SergioAraujo

@SergioAraujo, це робить рішення також більш чистим, дякую за пораду!
Марк

67

Наступний однокласник може виявитись корисним:

(піп> 20,0)

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

Старіші версії:

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

xargs -n1 продовжує працювати, якщо сталася помилка.

Якщо вам потрібен більш "дрібнозернистий" контроль над тим, що пропущено, а що викликає помилку, ви не повинні додавати -n1прапор і чітко визначати помилки, які слід ігнорувати, "прокладаючи" наступний рядок для кожної окремої помилки:

| sed 's/^<First characters of the error>.*//'

Ось робочий приклад:

pip list --format freeze --outdated | sed 's/=.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U

Довелося додати фільтри для рядків, що починаються з "Могли" та "Деякі", оскільки, мабуть, піп надсилає попередження stdout :(
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

Для pip просто видаліть 3s як такі:

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

Дивакованість OSX

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


1
Ще одним способом подолання юрського BSD sedOS X є використання gsedнатомість (GNU sed). Щоб отримати це,brew install gnu-sed
Вальтер Трос

@WalterTross ... Юрський ... хороший прикметник. Таким чином, тепер у нас є два способи групування пакетів оновлень для піп-файлів із приємним слідком аудиту на терміналі. (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

Однак це має бути позначено як остаточне рішення. Дійсно, прийнята відповідь буде працювати над усіма вашими пакетами пошти, що є марною витратою часу, якщо вам доведеться оновити лише 1 або 2 пакети. Це рішення, натомість, буде працювати лише над застарілими пакетами
AlessioX

34

У мене була та сама проблема з оновленням. Справа в тому, що я ніколи не оновлюю всі пакети. Я оновлюю лише те, що мені потрібно, тому що проект може зламатися.

Оскільки не було простого способу оновлення пакета до пакета та оновлення файла вимог.txt , я написав цей підшивач, який також оновлює версії у вашому 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
Морзе,

2
Це також працює з папкою вимог, що має загальні вимоги для розробників та розробників. Просто чудово!
cwhisperer


27

Одноланкова версія відповіді @ Рамана .

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

`


4
subprocess.call ("встановити sudo pip ... на випадок, якщо вам потрібні дозволи
Maximiliano Rios

4
@MaximilianoRios Будь ласка, не sudo pip installвикористовуйте замість цього віртуальне оточення .
Бенгт

22

при використанні virtualenv, і якщо ви просто хочете оновити пакети, додані до вашого virtualenv, можливо, вам потрібно зробити:

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

19

Найпростіше і найшвидше рішення, яке я знайшов під час обговорення проблеми з протоколами :

pip install pipdate
pipdate

Джерело: https://github.com/pypa/pip/isissue/3819


2
У той час як інші рішення затримувались при найменшій аномалії, це рішення попередило, а потім пропустило проблему, щоб продовжити інші пакети. Чудово!
Серж Стротобандт

18

Рішення 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 $_}було б доречніше.
brainplot

16

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

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


заморожування піп | awk -F '[=]' '{print $ 1}' | xargs pip install -U
JohnDHH

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

12

Ви можете спробувати це:

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

це найчистіший, найчитаєший спосіб оновлювати пакети піп у найбільшій кількості стислості. чудовий.
Марк Шуст у M.academy

12

Досить дивовижний жовток робить це легко.

pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

Для отримання додаткової інформації про жовток: https://pypi.python.org/pypi/yolk/0.4.3

Це може зробити багато речей, які, напевно, вам будуть корисні.


3
Ваша відповідь змінена з yolkна yolk3k, у початковій відповіді напевно були проблеми з python3
AXO

10

@ Відповідь Рамана працював найкраще для мене з тих, хто тут, але мені довелося додати кілька уловів:

import pip
for dist in pip.get_installed_distributions():
    if 'site-packages' in dist.location:
        try:
            pip.call_subprocess(['pip', 'install', '-U', dist.key])
        except Exception, exc:
            print exc

The site-packagesПеревірка виключає мої пакети розробки, тому що вони не знаходяться в каталозі сайту-пакети системи. Спроба, окрім просто пропускає пакунки, вилучені з PyPI.

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


У Ubuntu (та інших похідних Debian), pipмабуть, ставить пакети в /usr/local/lib/python2.7/dist-packagesчи подібні. Ви можете використовувати '/ usr / local / lib /' замість 'site-пакети' у ifзаяві в цьому випадку.
drevicko

10

pip_upgrade_outdatedРобить роботу. Відповідно до її документів :

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

Крок 1:

pip install pip-upgrade-outdated

Крок 2:

pip_upgrade_outdated

1
Крок 1: встановлення pip-застарілого оновлення. Крок 2: оновлення pip-застаріле ... виконано
shao.lo

9

Надіслано через запит на прохання до піп-фолк ; тим часом використовуйте це рішення бібліотеки піп, яке я написав:

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted

Версія з обробкою помилок (за коментарем): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
Самуель Маркс

9

Це, здавалося, працює для мене ...

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

Після цього я використав printfпробіл, щоб правильно розділити назви пакунків.


7

Це рішення PowerShell для Python 3:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

А для Python 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

Це оновлення пакетів один за одним. Так а

pip3 check
pip2 check

після цього слід переконатися, що ніякі залежності не порушені.



7

Найкоротший і найпростіший в Windows.

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

@Enkouyami у Windows 7 ця команда не працює без -r. -r повинен виключати шлях до файлу вимог.
Chockomonkey

6

Мій сценарій:

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

6

Хіба це не більш ефективно?

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -o перелічує застарілі пакети;
  2. grep -v -i warningперевернута відповідність, warningщоб уникнути помилок під час оновлення
  3. cut -f1 -d1' ' повертає перше слово - назву застарілого пакету;
  4. tr "\n|\r" " "перетворює результат багатолінійки з cutоднорядного списку, розділеного пробілом;
  5. awk '{if(NR>=3)print}' пропускає рядки заголовка
  6. cut -d' ' -f1 отримує перший стовпець
  7. xargs -n1 pip install -U бере 1 аргумент з труби, що залишилася від нього, і передає його команді для оновлення списку пакетів.

Ось мій результат: kerberos iwlib PyYAML Could pygpgme Could Could Could ...відзначте всі "Could" s. Вони випливають із результату програми pip list -o"Не вдалося знайти жодних завантажень, які задовольняли б вимогу <
packgege

Чи можете ви вставити вихід 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

один рядок у powershell 5.1 з правами adm, python 3.6.5 та pip ver 10.0.1:

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

вона працює безперебійно, якщо в списку немає зламаних пакетів чи спеціальних коліс ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.