Чи можливо оновити всі пакети Python одночасно pip
?
Зверніть увагу : на цьому офіційному трекері випуску є запит на функцію.
pip
установку під час оновлення requests
. Повідомлення про помилку є cannot import name IncompleteRead
.
Чи можливо оновити всі пакети Python одночасно pip
?
Зверніть увагу : на цьому офіційному трекері випуску є запит на функцію.
pip
установку під час оновлення requests
. Повідомлення про помилку є cannot import name IncompleteRead
.
Відповіді:
Ще немає вбудованого прапора, але ви можете використовувати його
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 ).
pip install -U
виконаю це , він оновить усі пакети. Я боюся, що це може спричинити конфлікт з apt-get.
tee
перед тим, як зробити фактичне оновлення, щоб ви могли отримати список оригінальних версій. Наприклад, pip freeze --local | tee before_upgrade.txt | ...
таким чином було б легше повернутись, якщо є якісь проблеми.
-H
щоб sudo
уникнути набридливого повідомлення про помилку: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Ви можете використовувати наступний код 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)
import pip
pip.install('packagename')
?
Оновити всі локальні пакети; Ви можете використовувати 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 .
pip-review --local --auto
Працює під 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" для оновлення всіх пакетів; якщо одне оновлення не вдалося, запустіть його ще раз, і воно продовжиться на наступному.
requirements.txt
«S =={version}
. Наприклад: python-dateutil==2.4.2
до python-dateutil
для всіх рядків.
$ pip freeze | cut -d '=' -f1> requirements.txt
для того, щоб видалити версію
pip3 install -r <(pip3 freeze) --upgrade
Ефективно, <(pip3 freeze)
це анонімна труба, але вона буде виконувати функції файлового об’єкта
Версія для Windows після консультації з чудовою документацією для FOR
Rob van der Woude
for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i
Швидше, оскільки вона лише спробує та оновить застарілі пакети
for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i
. Якщо це запускається з пакетного файлу, обов'язково використовуйте %%i
замість %i
. Також зауважте, що оновлення чистіше pip
перед запуском цієї команди за допомогою python -m pip install --upgrade pip
.
$ pip install pipupgrade
$ pipupgrade --verbose --latest --yes
pipupgrade допомагає оновити вашу систему, локальний або пакунки з requirements.txt
файлу! Він також вибірково оновлює пакети, які не порушують змін. pipupgrade також забезпечує оновлення пакетів, присутніх у декількох середовищах Python. Сумісний з Python2.7 +, Python3.4 + та pip9 +, pip10 +, pip18 +, pip19 +.
ПРИМІТКА: Я автор інструмента.
Checking...
назавжди, коли я спробував її.
[0;93mChecking...[0m
ModuleNotFoundError: No module named 'ctypes.windll'
Ви можете просто надрукувати застарілі пакети
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
python -m pip list outdated
(хоча це не у форматі вимог).
Цей варіант мені здається більш простим і зрозумілим:
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
дійсно може обробляти пропускні записи).
awk 'NR>2 {print $1}'
очищення результату для вас
Наступний однокласник може виявитись корисним:
(піп> 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
| sed 's/^<First characters of the error>.*//'
скільки потрібно. Дякую!
pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Більш надійне рішення
Для 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 у поєднанні з 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, може стати потенційною причиною пошкодження базу даних або пошкодження бази даних.
sed
OS X є використання gsed
натомість (GNU sed). Щоб отримати це,brew install gnu-sed
Це здається більш стислим.
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.
У мене була та сама проблема з оновленням. Справа в тому, що я ніколи не оновлюю всі пакети. Я оновлюю лише те, що мені потрібно, тому що проект може зламатися.
Оскільки не було простого способу оновлення пакета до пакета та оновлення файла вимог.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
аргумент до своєї команди.
Повне розкриття: я написав цей пакет.
virtualenv
не ввімкненоpip-upgrade --skip-virtualenv-check
З https://github.com/cakebread/yolk :
$ pip install -U `yolk -U | awk '{print $1}' | uniq`
однак вам потрібно спочатку придбати жовток:
$ sudo pip install -U yolk
Одноланкова версія відповіді @ Рамана .
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
`
sudo pip install
використовуйте замість цього віртуальне оточення .
Найпростіше і найшвидше рішення, яке я знайшов під час обговорення проблеми з протоколами :
pip install pipdate
pipdate
використовувати пакети для оновлення awk:
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
оновлення windows
foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
Ви можете спробувати це:
for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
Досить дивовижний жовток робить це легко.
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
Це може зробити багато речей, які, напевно, вам будуть корисні.
yolk
на yolk3k
, у початковій відповіді напевно були проблеми з python3
@ Відповідь Рамана працював найкраще для мене з тих, хто тут, але мені довелося додати кілька уловів:
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).
pip
мабуть, ставить пакети в /usr/local/lib/python2.7/dist-packages
чи подібні. Ви можете використовувати '/ usr / local / lib /' замість 'site-пакети' у if
заяві в цьому випадку.
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
Надіслано через запит на прохання до піп-фолк ; тим часом використовуйте це рішення бібліотеки піп, яке я написав:
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
Це рішення 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
після цього слід переконатися, що ніякі залежності не порушені.
Як щодо:
pip install -r <(pip freeze) --upgrade
Найкоротший і найпростіший в Windows.
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Хіба це не більш ефективно?
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
pip list -o
перелічує застарілі пакети;grep -v -i warning
перевернута відповідність, warning
щоб уникнути помилок під час оновленняcut -f1 -d1' '
повертає перше слово - назву застарілого пакету;tr "\n|\r" " "
перетворює результат багатолінійки з cut
однорядного списку, розділеного пробілом;awk '{if(NR>=3)print}'
пропускає рядки заголовка cut -d' ' -f1
отримує перший стовпецьxargs -n1 pip install -U
бере 1 аргумент з труби, що залишилася від нього, і передає його команді для оновлення списку пакетів.kerberos iwlib PyYAML Could pygpgme Could Could Could ...
відзначте всі "Could" s. Вони випливають із результату програми pip list -o
"Не вдалося знайти жодних завантажень, які задовольняли б вимогу <
pip list -o
?
# 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;
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
прапор, щоб він попросив вас встановити кожен пакет окремо.
один рядок у 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}
вона працює безперебійно, якщо в списку немає зламаних пакетів чи спеціальних коліс ...
pip freeze
(якbundle install
абоnpm shrinkwrap
). Найкраще зберегти його копію перед майструванням.