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


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

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


1387


источник


Ответы:


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

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

Примечание: для этого существуют бесконечные потенциальные вариации. Я пытаюсь сохранить этот ответ коротким и простым, но, пожалуйста, предлагайте варианты комментариев!

Соответствующие изменения:

  • Добавлено grepпропустить определения пакетов «-e», как предложено @jawache (да, вы могли бы заменить grep+ cutс sedили awkили perlили...).
  • Новые версии pipпозволяют вам перечислять устаревшие пакеты:

    pip list --outdated --format=freeze
    
  • добавленной -n1в xargs, предотвращает остановку всего, если обновление одного пакета не удается (спасибо @andsens )


1617



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

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)

507



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


482



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

делать

$ pip freeze > requirements.txt

откройте текстовый файл, замените == на> =

затем сделайте

$ pip install -r requirements.txt --upgrade

Если у вас возникла проблема с определенным пакетом, останавливающим обновление (иногда с помощью numpy), просто перейдите в каталог ($), закомментируйте имя (добавьте # перед ним) и снова запустите обновление. Позднее вы можете раскомментировать этот раздел. Это также отлично подходит для копирования глобальных сред python.

Мне также нравится метод проверки пипса:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

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


176



Windows version after consulting excellent documentation for FOR by Rob van der Woude

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

87



You can just print the packages that are outdated

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

69



The following one-liner might prove of help:

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

xargs -n1 keeps going if an error occurs.

If you need more "fine grained" control over what is omitted and what raises an error you should not add the -n1 flag and explicitly define the errors to ignore, by "piping" the following line for each separate error:

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

Here is a working example:

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

57



This option seems to me more straightforward and readable:

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

(awk '{ print $1}' selects the first word of the line (separated by a space))

And this version allows for the suppression of warning message from pip list --outdated:

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

(awk '!/<pattern>/' removes line containing a given pattern. In my case the warning messages include "Could not" and "ignored" respectively)

This could also be used to tackle the coming default columns format:

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

41



This seems more concise.

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

Explanation:

pip list --outdated gets lines like these

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

In cut -d ' ' -f1, -d ' ' sets "space" as the delimiter, -f1 means to get the first column.

So the above lines becomes:

urllib3
wheel

then pass them to xargs to run the command, pip install -U, with each line as appending arguments

-n1 limits the number of arguments passed to each command pip install -U to be 1


32



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

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

however you need to get yolk first:

$ sudo pip install -U yolk

26



More Robust Solution

For pip3 use this:

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

For pip, just remove the 3s as such:

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

OSX Oddity

OSX, as of July 2017, ships with a very old version of sed (a dozen years old). To get extended regular expressions, use -E instead of -r in the solution above.

Solving Issues with Popular Solutions

This solution is well designed and tested1, whereas there are problems with even the most popular solutions.

  • Portability issues due to changing pip command line features
  • Crashing of xargs because common pip or pip3 child process failures
  • Crowded logging from the raw xargs output
  • Relying on a Python-to-OS bridge while potentially upgrading it3

The above command uses the simplest and most portable pip syntax in combination with sed and sh to overcome these issues completely. Details of sed operation can be scrutinized with the commented version2.


Details

[1] Tested and regularly used in a Linux 4.8.16-200.fc24.x86_64 cluster and tested on five other Linux/Unix flavors. It also runs on Cygwin64 installed on Windows 10. Testing on iOS is needed.

[2] To see the anatomy of the command more clearly, this is the exact equivalent of the above pip3 command with comments:

# 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] Upgrading a Python or PIP component that is also used in the upgrading of a Python or PIP component can be a potential cause of a deadlock or package database corruption.


24