Python PIP Install кидає TypeError: непідтримувані типи операндів для - =: 'Повторити' та '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 Впевнений, додавши цю інформацію
девайтор

То звідки взялися ці колеса? pipзазвичай використовується вбудований requestsпакет, і requestsзазвичай він використовує вбудований urllib3пакет. Ці колеса не є вбудованими версіями і, ймовірно, несумісні з pipпідкласом деякого цього коду. /usr/share/python-wheelsможливо, відійти вбік?
Martijn Pieters

Я сподівався 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.
Martijn Pieters

Я абсолютно не маю про це уявлення! Де я повинен шукати інформацію про це, або що я можу зробити?
девайтер

Вибачте, тут немає простої відповіді; просто намагаюся діагностувати свої проблеми. Прослідкування несподіване і вказує на зіткнення між версіями. Ось чому нормально requestsі pipвкладайте свої залежності. У вашому прослідкуванні показано, що будь-які вбудовані версії не використовуються, але чому це не знаю.
Martijn Pieters

Відповіді:


87

Ubuntu поставляється з версією 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] В дозволі відмовлено: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'"
девайтор

2
@mirror, використовуй sudo, тому що get-pip.py спробує встановити pip
Raghuram Vadapalli

45
Ця проблема не має нічого спільного з pip. слід стека показує, що запит на отримання пакета не вдається, що вказує на мережеву проблему. Повідомлення ОП про перевстановлення піп буде просто об'їздом.
Том

2
це правильна відповідь, винуватецем є канонічне виправлення pip, яке залишається невиправленим протягом кількох випусків зараз: github.com/pypa/pip/isissue/4779
lurscher

2
Використовували його на малинових. Неможливо більше запустити "піп". Не вдалося запустити лише pip3. Я повинен був додати символічне посилання: пров -s / USR / місцеві / бен / піп / USR / бен / піп взятий (і модифікований) з цієї відповіді: stackoverflow.com/questions/29712519 / ...
TheTrowser

36

Якщо ви стоїте за проксі-сервером, перед початком інсталяції потрібно виконати кілька додаткових кроків налаштування. Ви повинні встановити змінну середовища http_proxy на адресу проксі. За допомогою bash це виконується за допомогою команди

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

Ви також можете надати

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

параметр до піп. [user:pass@]Частина НЕ є обов'язковою.


24

Оновлення 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

Тепер <venv>/bin/pipвикористовує встановлену версію, requestsяка має vellib3.


Дякую, я щойно видалив це, /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whlі це виправлено зараз (без віртуалів).
krsoni

Насправді в моєму випадку я не використовував віртуальне оточення.
krsoni

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

7

порт 443 не відкритий, просто дозвольте користувальницькому порту tcp 443, якщо на AWS ще відкрити порт 443 для вихідних з'єднань ...


Це допомогло мені великий час у моєму кластері OpenStack !! Гарний Діпак!
Арун Дас

5

Просто піп оновлення працював для мене:

pip install --upgrade pip


5
помилка трапляється зі мною під час виконання цієї дуже точної команди :(
allan.simon

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

1
Я також запускаю Raspian Stretch Lite, і помилку не виправили.
Стефан Вегенер

Я погоджуюсь, що це спрацювало чудово "python -m pip install
nadograd

2

У мене така ж проблема при установці RaspberryPI TFT від Adafruit з pitft.sh / adafruit-pitft.sh .

Мені не подобається, що стилі кодування з помилками десь трактуються якось - як видно з попередніх відповідей.

Зауваження: виняток помилки типу retry.py , очевидно, є помилкою, викликаною невідповідним призначенням та обчисленням екземпляра класу Відповідь на int зі значенням за замовчуванням 10 - десь у коді ... Потрібно виправити або шляхом додавання оператора inplace або виправлення помилкового призначення.

Тому спробував спочатку проаналізувати та виправити помилку. Фактична помилка в моєму випадку однакова - retry.py викликається pip .

Сценарій встановлення 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: непідтримувані типи операндів для - =: 'Повторити' та '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: непідтримувані типи операндів для - =: 'Повторити' та '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

Звуковий вихід з тимчасовим виправленням (відображається двічі ...?):

Повторна спроба (Повторна спроба (загальна = 1, підключення = Немає, читання = Немає, переадресація = Немає)) після з'єднання, розірваного на 'ConnectTimeoutError (<questions.packages.urllib3.connection.VerifiedHTTPSConnection object at /

Повторна спроба (Повторна спроба (загальна = 0, підключення = Немає, читання = Немає, переадресація = Немає)) після з'єднання, перерваного на 'ConnectTimeoutError (<request.packages.urllib3.connection.VerifiedHTTPSConnection object at /

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

Не знайдено відповідного розподілу для evdev

Попередження: Pip не вдалося встановити програмне забезпечення!

Тож у моєму випадку насправді дві речі викликають помилку, це може відрізнятися в інших середовищах:

  1. Відсутній evdev => спробуйте встановити
  2. Не вдалося підключити репо / dist, що містить 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 користувач - для всіх локальних облікових записів, виявлених як встановлених:

    судо су -

    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)

І це працює ..

Сподіваюся, це допомагає і в інших випадках.

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

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

Дивіться також: випуск - 35334: https://bugs.python.org/issue35334

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

Дивіться також зараз: випуск - 1486: https://github.com/urllib3/urllib3/isissue/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команду virtualenv myVirtualEnv. Я тільки що додав a sudoперед командою; це все вирішило.


Це не рішення: я запускаю як root у docker і маю ту саму проблему. Крім того, ви не пояснюєте, чому працює як root.
Ерік

1
@Eric, я просто використав підхід проб і помилок; Я не знаю основної мети. Це працювало на мене, тому я запропонував.
Зейнаб Аббасімазар

1

Рішення:
1. sudo apt remove python-pip
2. pip3 install pip(або встановити pip від get-pip.py )

Чому:
Ця помилка сталася на pip 8.0.1, який встановив apt-get. І сталося лише тоді, коли ваша мережа нестабільна.

Якщо у вас встановлено файл pip з 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.