Як оновити всі пакети 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.