Можно ли обновить все пакеты Python одновременно с помощью pip
?
Примечание . Для этого есть запрос функции в официальном трекере проблем.
Можно ли обновить все пакеты Python одновременно с помощью pip
?
Примечание . Для этого есть запрос функции в официальном трекере проблем.
Встроенного флага пока нет, но вы можете использовать
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.
- Jabba
13 сен.
tee
перед выполнением фактического обновления, чтобы вы могли получить список исходных версий. Например, таким pip freeze --local | tee before_upgrade.txt | ...
образом было бы легче вернуться в случае каких-либо проблем.
- Emil H
4 марта '14 в 6: 292014-03-04 06:29
-H
чтобы sudo
избежать раздражающего сообщения об ошибке: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
- Mario S
17 мар.
Вы можете использовать следующий код 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)
import pip
pip.install('packagename')
?
- endolith
06 марта '12 в 16: 182012-03-06 16:18
Обновить все локальные пакеты; вы можете использовать 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 .
Следующее работает в Windows и должно быть полезно и для других ( $
независимо от того, в каком каталоге вы находитесь в командной строке. Например, C: / Users / Username ).
Делать
$ pip freeze > requirements.txt
Откройте текстовый файл, замените ==
с >=
, или СЭД сделать это для вас:
$ sed -i 's/==/>=/g' requirements.txt
и выполните:
$ pip install -r requirements.txt --upgrade
Если у вас есть проблема с определенным пакетом, который останавливает обновление ( иногда NumPy ), просто перейдите в каталог ($), закомментируйте имя (добавьте #
перед ним) и снова запустите обновление. Позже вы можете раскомментировать этот раздел. Это также отлично подходит для копирования глобальных сред Python.
Другой путь:
Еще мне нравится метод pip-review:
py2
$ pip install pip-review
$ pip-review --local --interactive
py3
$ pip3 install pip-review
$ py -3 -m pip_review --local --interactive
Вы можете выбрать «a», чтобы обновить все пакеты; если одно обновление не удалось, запустите его снова, и оно продолжится на следующем.
requirements.txt
файлы =={version}
. Например: python-dateutil==2.4.2
для python-dateutil
всех линий.
- youngminz
15 мая '16 в 5: 282016-05-15 05:28
pip3 install -r <(pip3 freeze) --upgrade
Effectively, <(pip3 freeze)
это анонимный канал, но он будет действовать как файловый объект
- Sergiy Kolodyazhnyy
3 сен '18 в 22:17
$ 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+.
Примечание: я являюсь автором инструмента.
Checking...
навсегда, когда я ее попробовал.
- CGFoX
22 марта '19 в 06:46
ModuleNotFoundError: No module named 'ctypes.windll'
- Qin Heyang
13 ноя '19 в 3:55
Версия для Windows после ознакомления с отличной документациейFOR
Роба ван дер Вуде:
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
Быстрее, так как он будет пытаться обновлять только «устаревшие» пакеты
- Refael Ackermann
19 апр '16 в 19:30
for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i
. Если это запускается из командного файла, обязательно используйте %%i
вместо %i
. Также обратите внимание, что pip
перед запуском этой команды проще выполнить обновление с помощью python -m pip install --upgrade pip
.
- Andy
13 июл.
Этот вариант мне кажется более простым и читаемым:
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
действительно может обрабатывать пропущенные записи).
Вы можете просто распечатать устаревшие пакеты:
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:'
- Jeremy Blanchard
28 марта '12 в 22: 462012-03-28 22:46
python -m pip list outdated
(хотя это не в формате требований).
- Jacktose
28 окт.
Следующая однострочная строка может оказаться полезной:
(пункт> 20,0)
pip list --format freeze --outdated | sed 's/=.*//g' | xargs -n1 pip install -U
Older Versions:
pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U
xargs -n1
продолжает работать, если возникает ошибка.
Если вам нужен более «мелкозернистый» контроль над тем, что пропущено и что вызывает ошибку, вам не следует добавлять -n1
флаг и явно определять ошибки, которые следует игнорировать, путем «связывания» следующей строки для каждой отдельной ошибки:
| sed 's/^<First characters of the error>.*//'
Вот рабочий пример:
pip list --format freeze --outdated | sed 's/=.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U
| sed 's/^<First characters of the error>.*//'
сколько нужно. Спасибо!
- raratiru
3 ноя '15 в 0:31
Более надежное решение
Для pip3 используйте это:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
Для pip просто удалите 3 как таковые:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OS X странность
OS X, по состоянию на июль 2017 года, поставляется с очень старой версией sed (десятилетней давности). Чтобы получить расширенные регулярные выражения, используйте -E
вместо -r
в приведенном выше решении.
Решение проблем с помощью популярных решений
Это решение хорошо спроектировано и протестировано 1 , тогда как проблемы возникают даже с самыми популярными решениями.
Приведенная выше команда использует простейший и наиболее переносимый синтаксис pip в сочетании с 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
- Walter Tross
09 янв.
Это кажется более кратким.
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.
- Reman
26 ноя '16 в 14:01
У меня была такая же проблема с обновлением. Дело в том, что я никогда не обновляю все пакеты. Я обновляю только то, что мне нужно, потому что проект может сломаться.
Поскольку не было простого способа обновить пакет за пакетом и обновить файл 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
аргумент в свою команду.
Полное раскрытие: я написал этот пакет.
Однострочная версия ответа Раманы .
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
используйте вместо этого виртуальный env .
- Bengt
20 фев '16 в 15:28
С https://github.com/cakebread/yolk :
$ pip install -U `yolk -U | awk '{print $1}' | uniq`
Однако сначала нужно получить желток:
$ sudo pip install -U yolk
При использовании virtualenv и если вы просто хотите обновить пакеты, добавленные в ваш virtualenv, вы можете сделать:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
Самое простое и быстрое решение, которое я нашел при обсуждении проблемы с пипсом, это:
pip install pipdate
pipdate
Источник: https://github.com/pypa/pip/issues/3819
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Используйте пакеты обновления AWK :
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
Обновление Windows PowerShell
foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
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
Вы можете попробовать это:
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.
- AXO
19 дек.
Чистая оболочка Bash / Z для достижения этого:
for p in $(pip list -o --format freeze); do pip install -U ${p%%=*}; done
Или в красиво отформатированном виде:
for p in $(pip list -o --format freeze)
do
pip install -U ${p%%=*}
done
for p in $(pip list -o --format freeze); do echo "${p} -> ${p%%=*}"; done
. В более общем смысле, ${haystack%%needle}
значит delete longest match of needle from back of haystack
.
- German Lashevich
10 июн.
Обновление пакетов 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/
pip freeze > requirements.txt
потом, чтобы увидеть фактическую разницу.
- aggsol
9 марта в 10:09
Ответ Раманы сработал для меня лучше всего из тех, кто здесь, но мне пришлось добавить несколько уловок:
import pip
for dist in pip.get_installed_distributions():
if 'site-packages' in dist.location:
try:
pip.call_subprocess(['pip', 'install', '-U', dist.key])
except Exception, exc:
print exc
site-packages
Проверка исключает мои пакеты разработки, потому что они не находятся в каталоге сайта-пакеты системы. Команда try-except просто пропускает пакеты, удаленные из PyPI.
Для endolith : я тоже надеялся на легкое pip.install(dist.key, upgrade=True)
, но не похоже, что pip предназначался для использования чем-либо, кроме командной строки (в документации не упоминается внутренний API, а разработчики pip не использовали строки документации).
pip
видимому, помещает пакеты /usr/local/lib/python2.7/dist-packages
или аналогичные. В этом случае вы можете использовать '/ usr / local / lib /' вместо 'site-packages' в if
заявлении.
- drevicko
13 янв.
Использовать:
pip install -r <(pip freeze) --upgrade
Одна строка в 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}
Работает без сбоев, если в списке нет битых пакетов или специальных колес ...
Самый короткий и простой в Windows.
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Отправлено через пул-реквест сотрудникам pip ; тем временем используйте это решение библиотеки pip, которое я написал:
from pip import get_installed_distributions
from pip.commands import install
install_cmd = install.InstallCommand()
options, args = install_cmd.parse_args([package.project_name
for package in
get_installed_distributions()])
options.upgrade = True
install_cmd.run(options, args) # Chuck this in a try/except and print as wanted
Мне показалось, что это сработало ...
pip install -U $(pip list --outdated | awk '{printf $1" "}')
printf
Впоследствии я использовал пробел, чтобы правильно разделить имена пакетов.
Это решение 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 freeze
(например,bundle install
илиnpm shrinkwrap
). Лучше сохранить копию, прежде чем возиться. - Colonel Panic 22 мая '13 в 13:01pip list --format freeze | %{pip install --upgrade $_.split('==')[0]}
(я пока не могу опубликовать здесь ответ) - Xeнεi Ξэnвϵς 7 мар в 5:11