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

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

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

30 ответов


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

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


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

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)

для обновления всех локальных пакетов; вы можете использовать pip-review:

$ pip install pip-review
$ pip-review --local --interactive

pip-review форк pip-tools. См.pip-tools вопрос упомянутые @knedlsepp. pip-review пакет работает, но больше не работает.

pip-review работает на Windows начиная с версии 0.5.


работает на Windows. И для других тоже. ($- это любой каталог, в котором вы находитесь, в командной строке. например. C:/Users/Username>)

do

$ 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

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


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

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

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

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

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

pip list --format legacy --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 продолжает работать, если возникает ошибка.

Если вам нужен более "мелкозернистый" контроль над тем, что опущено, и что вызывает ошибку, вы не должны добавлять -n1 флаг и явно определить ошибки для игнорирования, "трубопроводом" следующую строку для каждой отдельной ошибки:

| sed 's/^<First characters of the error>.*//'

вот пример:

pip list --format legacy --outdated | sed 's/(.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U

эта опция кажется мне более простой и читаемой:

pip install -U `pip list --outdated | awk '{ print }'`

(awk '{ print }' выбирает первое слово строки (разделенное пробелом))

и эта версия позволяет для подавления предупреждающего сообщения от pip list --outdated:

pip install -U `pip list --outdated | awk '!/Could not|ignored/ { print }'`

(awk '!/<pattern>/' удаляет строку, содержащую заданный узор. В моем случае предупреждающие сообщения включают" не удалось "и" проигнорировано " соответственно)

это также может быть использовано для решения предстоящего по умолчанию columns формат:

pip install -U `pip list --format=columns --outdated | awk '!/Package|---/{ print }'`

это кажется более лаконичным.

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


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

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

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

$ sudo pip install -U yolk

Более Надежное Решение

для pip3 используйте это:

pip3 freeze --local |sed -rn 's/^([^=# \t\][^ \t=]*)=.*/echo; echo Processing  ...; pip3 install -U /p' |sh

для pip просто удалите 3s как таковые:

pip freeze --local |sed -rn 's/^([^=# \t\][^ \t=]*)=.*/echo; echo Processing  ...; pip install -U /p' |sh

OSX странность

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

решение проблем с популярными решениями

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

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

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

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U "

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


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

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

`


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

потому что не было простого способа обновления пакета по пакетам и обновления требований.txt файл, я написал это pip-upgrader, который также обновляет версии в вашем для выбранных пакетов (или всех пакеты.)

установка

pip install pip-upgrader

использование

активируйте virtualenv (важно, потому что он также установит новые версии обновленных пакетов в текущем virtualenv).

cd в каталог проекта, затем запустите:

pip-upgrade

дополнительные функции

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

pip-upgrade path/to/requirements.txt

если вы уже знаете, какой пакет вы хотите обновить, просто отправьте их в качестве аргументов:

pip-upgrade -p django -p celery -p dateutil

Если вам нужно обновить до версии pre-release / post-release, добавьте --prerelease аргумент вашей команды.

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


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

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

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

for i in ` pip list|awk -F ' ' '{print }'`;do pip install --upgrade $i;done

решение Windows Powershell

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

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

sudo -H pip install pipdate
sudo -H pipdate

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


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

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

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


отправлено через pull-запрос к народу 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 " "}')

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


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

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

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


мой скрипт:

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

разве это не эффективно?

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

Как насчет:

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

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


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

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

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


я попробовал код Ramana, и я узнал, что на 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)

вот еще один способ сделать со скриптом на 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])

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

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)

Я использую полиуретан в последнее время. Все просто и по делу. Он обновляет ваш 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 ...