Вопрос:

Как обновить все пакеты Python с помощью pip?

python pip

1009938 просмотра

30 ответа

9276 Репутация автора

Можно ли обновить все пакеты Python одновременно pip?

Обратите внимание : на официальном трекере проблем есть запрос для этого.

Автор: thedjpetersen Источник Размещён: 27.04.2010 09:23

Ответы (30)


1959 плюса

31686 Репутация автора

Решение

Пока нет встроенного флага, но вы можете использовать

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 ).

Автор: rbp Размещён: 10.08.2010 07:56

616 плюса

6533 Репутация автора

Вы можете использовать следующий код 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)
Автор: Ramana Размещён: 30.04.2011 03:31

72 плюса

845 Репутация автора

Вы можете просто распечатать пакеты, которые устарели

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Автор: janrito Размещён: 10.06.2011 12:50

17 плюса

194 Репутация автора

при использовании virtualenv и если вы просто хотите обновить пакеты, добавленные в virtualenv, вы можете сделать следующее:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
Автор: brunobord Размещён: 13.09.2011 09:42

111 плюса

29802 Репутация автора

Версия для Windows после консультации отличную документацию для FORРоб ван дер Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
Автор: Piotr Dobrogost Размещён: 25.02.2012 06:04

26 плюса

318 Репутация автора

С https://github.com/cakebread/yolk :

$ pip install -U `yolk -U | awk '{print $1}' | uniq`

однако сначала нужно получить желток:

$ sudo pip install -U yolk
Автор: tkr Размещён: 03.04.2012 09:38

10 плюса

7702 Репутация автора

Ответ @ Раманы работал лучше всего для меня, из тех, что здесь, но мне пришлось добавить несколько уловов:

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 не использовали строки документации).

Автор: chbrown Размещён: 27.10.2012 10:56

584 плюса

284289 Репутация автора

Обновить все локальные пакеты; Вы могли бы использовать 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 .

Автор: jfs Размещён: 29.04.2013 12:34

25 плюса

18986 Репутация автора

Однострочная версия ответа @ Ramana .

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

`

Автор: Salman for Hire Размещён: 22.05.2013 12:42

12 плюса

129 Репутация автора

Вы можете попробовать это:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
Автор: 何宗翰 Размещён: 17.07.2013 01:43

9 плюса

435 Репутация автора

Послано через запрос на получение ответа народу пипа ; тем временем используйте это решение для библиотеки пипсов, которое я написал:

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
Автор: Samuel Marks Размещён: 26.01.2014 09:31

60 плюса

3607 Репутация автора

Следующая строка может оказаться полезной:

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
Автор: raratiru Размещён: 07.03.2014 08:25

6 плюса

153 Репутация автора

Разве это не более эффективно?

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 аргумент из канала слева от него и передает его команде для обновления списка пакетов.
Автор: Alex V Размещён: 09.10.2014 02:23

55 плюса

831 Репутация автора

Этот вариант кажется мне более простым и читабельным:

pip install -U `pip list --outdated | tail -n +3 | awk '{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

tail -n +3пропускает первые две строки и awk '{print $1}'выбирает первое слово каждой строки.

Автор: Marc Размещён: 21.11.2014 11:15

9 плюса

236 Репутация автора

Казалось, это работает для меня ...

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

printfВпоследствии я использовал пробел для правильного разделения имен пакетов.

Автор: SaxDaddy Размещён: 05.08.2015 10:20

259 плюса

2938 Репутация автора

Работает на 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

Вы можете выбрать «а» для обновления всех пакетов; если одно обновление не удалось, запустите его снова и оно продолжится на следующем.

Автор: azazelspeaks Размещён: 12.11.2015 09:20

12 плюса

1245 Репутация автора

Довольно удивительный желток делает это легко.

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

Это может сделать много вещей, которые вы, вероятно, найдете полезными.

Автор: user1175849 Размещён: 01.06.2016 07:39

36 плюса

661 Репутация автора

Это кажется более кратким.

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

Автор: Shihao Xu Размещён: 10.06.2016 03:47

16 плюса

1020 Репутация автора

Решение Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Автор: Apeirogon Prime Размещён: 16.09.2016 09:07

6 плюса

225 Репутация автора

Мой сценарий:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
Автор: Icyblade Размещён: 10.01.2017 02:17

5 плюса

21686 Репутация автора

import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
    pip.main(['install', '--upgrade', pkg])

или даже:

import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)

Работает быстро, так как не постоянно запускает оболочку. Я хотел бы найти время, чтобы получить это на самом деле, используя список устаревших, чтобы еще больше ускорить процесс.

Автор: Steve Barnes Размещён: 09.02.2017 05:23

38 плюса

1723 Репутация автора

Более надежное решение

Для 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

OSX, по состоянию на июль 2017 года, поставляется с очень старой версией sed (дюжиной лет). Чтобы получить расширенные регулярные выражения, используйте -E вместо -r в решении выше.

Решение проблем с помощью популярных решений

Это решение хорошо спроектировано и протестировано 1 , в то время как есть проблемы даже с самыми популярными решениями.

  • Проблемы переносимости из-за изменения функций командной строки pip
  • Сбой xargs из-за общих сбоев дочерних процессов pip или pip3
  • Переполненное ведение журнала из необработанного вывода xargs
  • Опираясь на мост Python-to-OS, потенциально обновляя его 3

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

Автор: Douglas Daseeco Размещён: 20.02.2017 12:45

29 плюса

1262 Репутация автора

У меня была такая же проблема с обновлением. Дело в том, что я никогда не обновляю все пакеты. Я обновляю только то, что мне нужно, потому что проект может сломаться.

Поскольку не было простого способа обновить пакет за пакетом и обновить файл needs.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аргумент в вашу команду.

Полное раскрытие: я написал этот пакет.

Автор: Simion Agavriloaei Размещён: 26.04.2017 06:43

5 плюса

367 Репутация автора

Это решение 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

После этого следует убедиться, что зависимости не нарушены.

Автор: Nils Ballmann Размещён: 04.07.2017 01:49

13 плюса

1055 Репутация автора

Самое простое и быстрое решение, которое я нашел в обсуждении проблемы pip :

sudo -H pip install pipdate
sudo -H pipdate

Источник: https://github.com/pypa/pip/issues/3819

Автор: RedEyed Размещён: 28.08.2017 01:49

5 плюса

59 Репутация автора

Как насчет:

pip install -r <(pip freeze) --upgrade
Автор: user8598996 Размещён: 12.09.2017 04:50

11 плюса

151 Репутация автора

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

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

Автор: JohnDHH Размещён: 09.11.2017 09:19

6 плюса

2154 Репутация автора

Это 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
Автор: adrin Размещён: 13.04.2018 11:24

7 плюса

94 Репутация автора

Самый короткий и простой на Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Автор: Ankireddy Размещён: 23.04.2018 07:06

66 плюса

906 Репутация автора

Используйте pipupgrade !

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

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

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

ПРИМЕЧАНИЕ: я автор инструмента.

Автор: Achilles Gasper Rasquinha Размещён: 16.01.2019 01:26
Вопросы из категории :
32x32