Можно ли обновить все пакеты 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)
Для пункта> = 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: / Users / Username>)
делать
$ pip freeze > 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
Вы можете выбрать «а» для обновления всех пакетов; если одно обновление не удалось, запустите его снова и оно продолжится на следующем.
requirements.txt
это =={version}
. Например: python-dateutil==2.4.2
для python-dateutil
всех линий.
$ pip freeze | cut -d '=' -f1> requirements.txt
для того, чтобы удалить версию
pip3 install -r <(pip3 freeze) --upgrade
Effectively, <(pip3 freeze)
это анонимный канал, но он будет действовать как файловый объект
Версия для Windows после консультации отличную документацию для FOR
Роба ван дер 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
Для пункта, просто удалите 3s как таковые:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OSX Oddity
По состоянию на июль 2017 года OSX поставляется с очень старой версией sed (дюжиной лет). Чтобы получить расширенные регулярные выражения, используйте -E вместо -r в решении выше.
Решение проблем с помощью популярных решений
Это решение хорошо спроектировано и протестировано 1 , в то время как есть проблемы даже с самыми популярными решениями.
Приведенная выше команда использует простейший и наиболее переносимый синтаксис пипса в сочетании с 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.
У меня была такая же проблема с обновлением. Дело в том, что я никогда не обновляю все пакеты. Я обновляю только то, что мне нужно, потому что проект может сломаться.
Поскольку не было простого способа обновить пакет за пакетом и обновить файл require.txt , я написал этот pip-upgradeer, который также обновляет версии в вашем 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
используйте виртуальную среду .
Решение Windows Powershell
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}
?
pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
было бы более уместным.
Самое простое и быстрое решение, которое я нашел в обсуждении проблемы pip :
pip install pipdate
pipdate
Источник: https://github.com/pypa/pip/issues/3819
используйте пакеты обновления awk:
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
обновление Windows PowerShell
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
site-packages
Проверка исключает мои пакеты разработки, потому что они не находятся в каталоге сайта-пакеты системы. Try-кроме просто пропускает пакеты, которые были удалены из 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
выражении.
Это 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 ...
Обратите внимание на все «Могли». Они вытекают из вывода 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
). Лучше всего сохранить копию этого перед тем, как возиться.