Python PIP Install выдает TypeError: неподдерживаемые типы операндов для - =: 'Retry' и 'int'


107

Использование pip installдля любого модуля, очевидно, в моей системе Ubuntu 16.04 с python 2.7.11+ вызывает эту ошибку:

TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

Что не так с пипсом? Как его переустановить, если нужно?

Обновление: полная трассировка ниже

sunny@sunny:~$ pip install requests
Collecting requests
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 328, in run
    wb.build(autobuilding=True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 748, in build
    self.requirement_set.prepare_files(self.finder)
  File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 360, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 512, in _prepare_file
    finder, self.upgrade, require_hashes)
  File "/usr/lib/python2.7/dist-packages/pip/req/req_install.py", line 273, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 442, in find_requirement
    all_candidates = self.find_all_candidates(req.name)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 400, in find_all_candidates
    for page in self._get_pages(url_locations, project_name):
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 545, in _get_pages
    page = self._get_page(location)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 648, in _get_page
    return HTMLPage.get_page(link, session=self.session)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 757, in get_page
    "Cache-Control": "max-age=600",
  File "/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/sessions.py", line 480, in get
    return self.request('GET', url, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/download.py", line 378, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/sessions.py", line 468, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
  File "/usr/share/python-wheels/CacheControl-0.11.5-py2.py3-none-any.whl/cachecontrol/adapter.py", line 46, in send
    resp = super(CacheControlAdapter, self).send(request, **kw)
  File "/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/adapters.py", line 376, in send
    timeout=timeout
  File "/usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 610, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 228, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

@MartijnPieters Конечно, добавляю эту информацию
devautor

Так откуда взялись эти колеса? pipобычно использует встроенный requestsпакет и requestsобычно использует встроенный urllib3пакет. Эти колеса не являются встроенными версиями и, вероятно, несовместимы с pipподклассом части этого кода. /usr/share/python-wheelsвозможно отойти в сторону?
Мартейн Питерс

Я бы ожидал pipиспользовать pip/_vendor/requests/и pip/_vendor/requests/packages/urllib3/, а не /usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requestsили /usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3.
Мартейн Питерс

Я понятия не имею об этом! Где мне искать информацию по этому поводу или что я могу сделать?
devautor

Извините, здесь нет простого ответа; просто пытаюсь диагностировать ваши проблемы. Отслеживание является неожиданным и указывает на конфликт между версиями. Вот почему обычно requestsи pipвстраивают свои зависимости. Ваша трассировка показывает, что какие-либо встроенные версии не используются, но почему я не знаю.
Мартейн Питерс

Ответы:


87

Ubuntu поставляется с версией PIP из докембрии, и поэтому вам нужно обновить ее, если вы не хотите тратить часы и часы на отладку проблем, связанных с pip.

apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py

Как вы заметили, я включил информацию как для Python 2.x, так и для 3.x


2
Выполнение python get-pip.py завершается с ошибкой "OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'»
devautor

2
@mirror, используйте sudo, потому что get-pip.py попытается установить pip
Рагурам Вадапалли,

45
Эта проблема не имеет ничего общего с pip. трассировка стека показывает, что запрос на получение пакета не выполняется, что указывает на сетевую проблему. Сказать OP переустановить pip будет просто обходным путем.
Том

2
это правильный ответ, виноват в pipтом, что каноническое исправление остается нефиксированным для нескольких выпусков: github.com/pypa/pip/issues/4779
lurscher

2
Использовал на распбериане. Не может больше запускать "пипс". Можно было запустить только pip3. Мне пришлось добавить символическую ссылку: ln -s / usr / local / bin / pip / usr / bin / pip, взятый (и измененный) из этого ответа: stackoverflow.com/questions/29712519/…
TheTrowser

37

Если вы находитесь за прокси-сервером, перед началом установки необходимо выполнить некоторые дополнительные действия по настройке. Вы должны установить переменную среды http_proxy на адрес прокси-сервера. Используя bash, это можно сделать с помощью команды

export http_proxy="http://user:pass@my.site:port/" 

Вы также можете предоставить

--proxy=[user:pass@]url:port 

параметр в пункт. [user:pass@]Часть не является обязательной.


25

Для меня обновление setuptools прошло нормально.

sudo pip install --upgrade setuptools

У меня тоже сработало. Собственно, после этого я понял, что раньше ошибки появлялись после: Сбор setuptools (из kiwisolver> = 1.0.1-> matplotlib)
mayid

3
У меня это сработало и на Распиановом растяжении. Пожалуйста, примите этот ответ, чтобы его было легче найти
Сэм

после этого потребовалась перезагрузка, чтобы заставить его работать с raspbian
Pipo

4
Эта команда вызывает у меня ту же ошибку TypeError в Debian9. Это не универсальное решение.
sir__finley

15

Прежде всего, эта проблема возникает из-за проблем с сетью, и удаление и повторная установка всего не поможет. Вероятно, вы находитесь за прокси, и в этом случае вам нужно установить прокси.

Но в моем случае я столкнулся с проблемой, потому что я не был за прокси. Обычно я работаю за прокси, но при работе из дома я устанавливаю для прокси значение Нет в настройках сети.

Но я все еще получал те же ошибки даже после удаления настроек прокси.

Итак, когда я набрал

env | grep proxy

Я нашел что-то вроде этого:

http_proxy=http://127.0.0.1:1234/

И это было причиной того, что я все еще получал ту же ошибку, даже когда думал, что удалил настройки прокси.

Чтобы отключить этот прокси, введите

unset http_proxy

Следуйте тому же подходу для всех других записей, например https_proxy.


14

Здесь происходит то, что поставленные версии запроса / urllib3 конфликтуют при импорте в двух разных местах (тот же код, но разные имена). Если после этого у вас возникнет сетевая ошибка, он не будет пытаться получить колесо, но выйдет из строя с вышеуказанной ошибкой. Смотрите здесь для более глубокого погружения в эту ошибку.

Решение с системным пипсом см. Выше .

Если у вас есть эта проблема в virtualenv, созданном с помощью python -m venv(который по-прежнему копирует колеса /usr/share/python-wheels, даже если у вас установлен отдельно pip), самый простой способ "исправить" это:

  1. создайте virtualenv: /usr/bin/python3.6 -m venv ...
  2. установить requestsв среду (это может вызвать указанную выше ошибку):<venv>/bin/pip install requests
  3. удалите скопированные версии, requestsкоторые будут использоваться pip:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Теперь a <venv>/bin/pipиспользует установленную версию, у requestsкоторой есть urllib3.


Спасибо, я только что удалил это, /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whlи теперь это исправлено (без virtualenv).
krsoni

На самом деле в моем случае я не использовал виртуальный env.
krsoni

Если вы удалите файлы whl напрямую /usr/share/python-wheels, они python -m venvбольше не будут создаваться <venv>/bin/pip . Поэтому, если вы удалите эти файлы, будьте уверены, что они вам не нужны. Если вам нужен как системный, так и Venv-пакет, вам необходимо установить системный с помощью get-pip.py(см. Stackoverflow.com/a/37531821/1380673 ), и вам нужно удалить файлы whl в каждом venv.
Ян Катиньш

7

порт 443 не открыт, просто разрешите настраиваемый порт 443 tcp, если на AWS иначе откройте порт 443 для исходящих подключений ...


Это очень помогло мне в моем кластере OpenStack !! Хороший Дипак!
Арун Дас

5

Просто обновите pip для меня:

pip install --upgrade pip


5
ошибка произошла со мной при выполнении этой очень точной команды :(
allan.simon

Он исправил ошибку для меня на Raspbian Sketch Lite.
Рауль Салинас-Монтеагудо

1
Я также использую Raspian Stretch Lite, и это не устранило ошибку.
Стефан Вегенер

Я согласен, что это сработало прекрасно: «python -m pip install --upgrade pip»
imbatman

2

У меня такая же проблема при установке RaspberryPI TFT от Adafruit с помощью pitft.sh / adafruit-pitft.sh .

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

Примечание. Исключение ошибки типа retry.py , очевидно, является ошибкой, вызванной несоответствующим назначением и вычислением экземпляра класса. Ответьте на int со значением по умолчанию 10. - где-то в коде ... Должно быть исправлено либо добавив inplace-operator или исправив ошибочное присвоение.

Поэтому попробовал сначала проанализировать и исправить саму ошибку. Фактическая ошибка в моем случае случае одно и то же - retry.py называют пип .

Сценарий установки adafruit-pitft.sh / pitft.sh пытается применить urllib3, который сам пытается установить вложенные зависимости с помощью pip , поэтому та же ошибка.

adafruit-pitft.sh # или pitft.sh

...

_stacktrace = sys.exc_info () [2]) Файл "/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / util / retry.py", строка 228, в приращение

всего - = 1

TypeError: неподдерживаемые типы операндов для - =: 'Retry' и 'int'

Для текущего дистрибутива (на основе debian-9.6.0 / stretch):

Файл "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", строка 315, с приращением

всего - = 1

TypeError: неподдерживаемые типы операндов для - =: 'Retry' и 'int'

Следующий - грязный * :) - патч включает трассировку ошибки зондирования:

# File: retry.py - in *def increment(self, ..* about line 315
# original: total = self.total

# patch: quick-and-dirty-fix
# START:
if isinstance(self.total, Retry):
    self.total = self.total.total

if type(self.total) is not int:
    self.total = 2 # default is 10
# END:

# continue with original:
total = self.total

if total is not None:
    total -= 1

connect = self.connect
read = self.read
redirect = self.redirect
cause = 'unknown'
status = None
redirect_location = None

if error and self._is_connection_error(error):
    # Connect retry?
    if connect is False:
        raise six.reraise(type(error), error, _stacktrace)
    elif connect is not None:
        connect -= 1

Вывод звучания с временным патчем (отображается дважды ...?):

Повторная попытка (Retry (total = 1, connect = None, read = None, redirect = None)) после разрыва соединения из-за ошибки ConnectTimeoutError (<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at /

Повторная попытка (Retry (total = 0, connect = None, read = None, redirect = None)) после разрыва соединения из-за ошибки ConnectTimeoutError (<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at /

Не удалось найти версию, удовлетворяющую требованию evdev (из версий:)

Не найдено подходящего распределения для evdev

ВНИМАНИЕ: Pip не удалось установить программное обеспечение!

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

  1. Отсутствует evdev => попробуйте установить
  2. Не удалось подключить репо / дист, содержащий evdev , для загрузки. => наконец бросить

Моя среда установки отключена от внутреннего зеркала debian + raspbian, поэтому я не хочу устанавливать прокси ...

Итак, я приступил к ручной установке недостающего компонента evdev :

  1. загрузите evdev из PyPI (или, например, с github.com):

    https://pypi.org/project/evdev/

    https://files.pythonhosted.org/packages/7e/53/374b82dd2ccec240b7388c65075391147524255466651a14340615aabb5f/evdev-1.1.2.tar.gz

  2. Распакуйте и установите вручную от имени пользователя root - для всех локальных учетных записей, определенных как установленные:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    установка python setup.py

  3. Снова вызовите скрипт установки:

    adafruit-pitft.sh # или pitft.sh

    ... Ответить на диалоги ...

    ...Это оно.

Если вы продолжите работу в Интернете с помощью прямого доступа PyPI :

  1. проверьте свою маршрутизацию + брандмауэр для доступа к pypi.org

  2. при необходимости установите прокси (http_proxy / https_proxy)

И это работает ..

Надеюсь, это поможет и в других случаях.

Арно-Кан Уэстуенсоэс

----------------------------------------------

См. Также: issue - 35334: https://bugs.python.org/issue35334

----------------------------------------------

См. Также: issue - 1486: https://github.com/urllib3/urllib3/issues/1486

для файла: https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py


2

проверьте наличие сетевых проблем, чтобы обойти код случая исключения

В моем случае я использовал настраиваемый индекс, у этого индекса не было маршрута, и это вызвало бы код случая исключения. Ошибка случая исключения все еще существует и по-прежнему маскирует реальную проблему, однако я смог обойти это, проверив подключение с помощью других инструментов, таких как nc -vzw1 myindex.example.org 443и повторные попытки, когда сеть была подключена.


1

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


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

1
Теперь это выглядит лучше? Я просто подумал, что должен упомянуть то, что
считаю

1

Я получил эту ошибку, когда пытался создать virtualenvкоманду with virtualenv myVirtualEnv. Я просто добавил sudoперед командой; это решило все.


Это не решение: я запускаю в докере как root и сталкиваюсь с той же проблемой. Также вы не объясняете, почему помогает запуск с правами root.
Эрик

1
@ Эрик, я просто использовал подход "проб и ошибок"; Я не знаю основной цели. У меня это сработало, поэтому я предложил.
Зейнаб Аббасимазар

1

Решение:
1. sudo apt remove python-pip
2. pip3 install pip(или установите pip с помощью get-pip.py )

Почему:
эта ошибка произошла в pip 8.0.1, установленном apt-get. И произошло только тогда, когда ваша сеть нестабильна.

Если у вас есть пип, установленный с помощью apt, он скрывает пип, который вы установили другими способами, поэтому вам следует сначала удалить apt.

Я отключил сеть и протестировал 8.0.1, 9.0.3, 10.x 3 версии, установленные с помощью pip3 или get-pip.py, ошибок не было. Итак, я думаю, что только подходящая версия pip 8.0.1 имеет эту ошибку, остальные в порядке.


1

В моем случае я открыл Pycharm в режиме sudo и запустил pip install nltk в терминале pycharm, который показал эту ошибку. запуск с sudo pip install решает ошибку.


0

У меня тоже была эта проблема. Изначально прокси ставился и работает нормально. Затем я подключился к сети, где она не проходит через прокси. После отключения прокси-пипса снова приступайте к работе.

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY

0

Как ни странно, если я удалю прокси из среды и добавлю его в командную строку, он у меня сработает. Например, чтобы обновить pipсебя:

env http_proxy= https_proxy= pip install pip --upgrade --proxy 'http://proxy-url:80'

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


0

Это рабочее решение найденной мной проблемы.

sudo apt-get clean
cd /var/lib/apt
sudo mv lists lists.old
sudo mkdir -p lists/partial
sudo apt-get clean
sudo apt-get update

0

Что касается меня, оказалось, что wlan0 не работает, в результате чего я не могу подключиться. Таким образом, обеспечение работы wlan0 позволяет pip / pip3 работать без проблем.


0

Я попробовал решение, указанное выше:

apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py

Когда я попробовал

python get-pip.py 
python3 get-pip.py

Я получил это сообщение

 Could not install packages due to an EnvironmentError:
[Errno 13] Permission denied: /usr/bin/pip3 Consider using the --user
 option or check the permissions.

Я сделал следующее, и это работает

python3 -m venv env
source ./env/bin/activate
Sudo apt-get update 
apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py
pip3 install pip
sudo easy_install pip
pip install --upgrade pip
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.