it-swarm.com.ru

Обновление всех пакетов с помощью pip

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

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

1588
thedjpetersen

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

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

1818
rbp

Вы можете использовать следующий код 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)
573
Ramana

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

545
jfs

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

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

216
azazelspeaks

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

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
99
Piotr Dobrogost

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

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
70
janrito

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

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
58
raratiru

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

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}' выбирает первое слово каждой строки.

51
Marc

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

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

35
Shihao Xu

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

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

28
Douglas Daseeco

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

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

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

27
Simion Agavriloaei

От https://github.com/cakebread/yolk :

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

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

$ Sudo pip install -U yolk
26
tkr

Однострочная версия @ ответа Раманы .

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

`

24
Salman Abbas

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

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
16
brunobord

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

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

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

 enter image description here

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

15
Achilles Gasper Rasquinha

Решение Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
15
Apeirogon Prime

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

Sudo -H pip install pipdate
Sudo -H pipdate

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

13
RedEyed

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

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
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

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

12
user1175849

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

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 исключает мои пакеты разработки, потому что они не находятся в системном каталоге site-packages. Try-кроме просто пропускает пакеты, которые были удалены из PyPI.

@endolith: Я тоже надеялся на простую pip.install(dist.key, upgrade=True), но похоже, что pip не предназначался для использования кем-либо, кроме командной строки (в документах не упоминается внутренний API, а разработчики pip не делали этого). использовать строки документов).

10
chbrown

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

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
9
Samuel Marks

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

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

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

9
SaxDaddy

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

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

8
JohnDHH

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

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
6
Icyblade

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

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
6
Ankireddy

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

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 аргумент из левого канала и передает его команде для обновления списка пакетов.
6
Alex V

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
5
adrin
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)

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

5
Steve Barnes

одна строка в 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}

это работает гладко, если в списке нет сломанных пакетов или специальных колес ...

5
Sébastien Wieckowski

Как насчет:

pip install -r <(pip freeze) --upgrade
5
user8598996

Я попробовал код Раманы и обнаружил, что в Ubuntu вы должны написать Sudo для каждой команды. Вот мой скрипт, который отлично работает на Ubuntu 13.10:

#!/usr/bin/env python
import pip
from subprocess import call

for dist in pip.get_installed_distributions():
    call("Sudo pip install --upgrade " + dist.project_name, Shell=True)
4
antibus

Я использую pur в последнее время. Все просто и по существу. Он обновляет ваш файл requirements.txt, чтобы отразить обновления, и затем вы можете обновить файл requirements.txt как обычно.

$ pip install pur
...
Successfully installed pur-4.0.1

$ pur
Updated boto3: 1.4.2 -> 1.4.4
Updated Django: 1.10.4 -> 1.10.5
Updated Django-bootstrap3: 7.1.0 -> 8.1.0
All requirements up-to-date.

$ pip install --upgrade -r requirements.txt
Successfully installed Django-1.10.5 ...
4
kichik

Вот сценарии, которые обновляют только устаревшие пакеты. 

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "--outdated", "--format=legacy"])
line = str(file).split()

for distro in line[::6]:
    call("pip install --upgrade " + distro, Shell=True)

Для новой версии pip, которая не выводится как устаревший формат (версия 18+).

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "-o", "--format=json"])
line = str(file).split()

for distro in line[1::8]:
    distro = str(distro).strip('"\",')
    call("pip install --upgrade " + distro, Shell=True)
4
Storm Shadow

Посмотреть все устаревшие пакеты

 pip list --outdated --format=columns

Устанавливать

 Sudo pip install pipdate

затем введите

 Sudo -H pipdate
4
Usman khan

Вот мой вариант ответа rbp, который обходит «редактируемые» и разрабатываемые дистрибутивы. Он имеет два недостатка оригинала: он перезагружает и переустанавливает без необходимости; и ошибка в одном пакете предотвратит обновление каждого пакета после этого.

pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --

Связанные сообщения об ошибках, немного отсоединенные после перехода с bitbucket:

4
Tobu

вот еще один способ сделать с помощью скрипта в Python

import pip, tempfile, contextlib

with tempfile.TemporaryFile('w+') as temp:
    with contextlib.redirect_stdout(temp):
        pip.main(['list','-o'])
    temp.seek(0)
    for line in temp:
        pk = line.split()[0]
        print('--> updating',pk,'<--')
        pip.main(['install','-U',pk])
4
Copperfield

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

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

4
Nils Ballmann

Одна строка в cmd:

for /F "delims= " %i in ('pip list --outdated --format=legacy') do pip install -U %i

Так что 

pip check 

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

2
Ilya

И еще один способ: for pkg in $(pip list | cut -d' ' -f1); do Sudo pip install --upgrade $pkg; done

2
user1529891
import os
import pip
from subprocess import call, check_call

pip_check_list = ['pip', 'pip3']
pip_list = []
FNULL = open(os.devnull, 'w')


for s_pip in pip_check_list:
    try:
        check_call([s_pip, '-h'], stdout=FNULL)
        pip_list.append(s_pip)
    except FileNotFoundError:
        pass


for dist in pip.get_installed_distributions():
    for pip in pip_list:
        call("{0} install --upgrade ".format(pip) + dist.project_name, Shell=True)

Я взял @ ответ Раманы и сделал его дружелюбным к pip3.

2
Mo Ali

В качестве другого ответа здесь говорится: 

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U

Это возможное решение, Некоторые комментарии здесь, включая меня, имели проблемы с разрешениями при использовании этой команды. Небольшое изменение в следующем решило это для меня.

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 Sudo -H pip install -U

Обратите внимание на добавленный Sudo -H, который позволил команде копаться с правами суперпользователя. 

2
thebeancounter

Вот мой вариант:

pip list --outdated --format=legacy | awk '{print $1;}' | xargs -n1 pip install -U
2
Jaime Arias
pip list -o | cut -d' ' -f1 | xargs -n1 pip install -U 2> /dev/null

если у вас есть две разные версии python, и вы хотите обновить только все пакеты python3, просто введите pip3 вместо pip.

2> /dev/null предназначен для избавления от всех раздражающих сообщений об ошибках 

1
AkaKaras

Самое короткое и простое, что я могу найти:

pip install -U $(pip freeze | cut -d"=" -f1)

Клавиша $(cmd) позволяет обернуть любую командную строку оболочки (она возвращает свой вывод).

1
Alexandre Huat

Чистый bash/zsh oneliner для этого:

for p in $(pip list -o --format freeze); do pip install -U ${p%%=*}; done

Или в формате Nice:

for p in $(pip list -o --format freeze)
do
    pip install -U ${p%%=*}
done
1
German Lashevich

Быстрый и простой способ обновления всех установленных пакетов может быть следующим:

for pkg in $(pip list | cut -d' ' -f1) ; do pip install $pkg -U ; done
0
Riccardo M.
python -c 'import pip; [pip.main(["install", "--upgrade", d.project_name]) for d in pip.get_installed_distributions()]'

Один лайнер!

0
Achilles Gasper Rasquinha

Если вы хотите обновить только пакеты, установленные с помощью pip, и избежать обновления пакетов, установленных другими инструментами (такими как apt, yum и т.д.), То вы можете использовать этот скрипт, который я использую в своей Ubuntu (возможно, работает и в других дистрибутивах) - на основе этот пост :

printf "To update with pip: pip install -U"
pip list --outdated 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo
0
keypress
  1. сначала установите jq (mac):

    $ brew install jq

2.

$pip3 install --upgrade  `pip3 list --outdated --format json | jq '.[] | .name' | awk -F'"' '{print $2}'`
0
Cando Zhou

Просто добавив JSON + JQ ответ для записей:

pip list -o --format json | jq '.[] | .name' | xargs pip install -U
0
Alex

лучшее решение, которое работает даже в conda env:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 |cut -d ':' -f 2 | xargs -n1 pip install -U
0
ermiabivatan