Python PIP Install zgłasza błąd TypeError: nieobsługiwane typy operandów dla - =: „Ponów próbę” i „int”


107

Użycie pip installdla dowolnego modułu widocznie w moim systemie Ubuntu 16.04 z Pythonem 2.7.11+ powoduje zgłoszenie tego błędu:

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

Co jest nie tak z pipem? Jak mogę go ponownie zainstalować, jeśli to konieczne?

Aktualizacja: Pełne śledzenie znajduje się poniżej

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 Jasne, dołączając tę ​​informację
devautor

Więc skąd się wzięły te koła? pipnormalnie użyłby requestspakietu osadzonego i requestsnormalnie użyłby urllib3pakietu osadzonego . Te koła nie są wersjami osadzonymi i prawdopodobnie są niekompatybilne z pippodklasą części tego kodu. /usr/share/python-wheelsmoże odsunąć się na bok?
Martijn Pieters

Spodziewałbym pipsię użyć pip/_vendor/requests/i pip/_vendor/requests/packages/urllib3/, nie /usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requestslub /usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3.
Martijn Pieters

Nie mam o tym pojęcia! Gdzie mam szukać informacji na ten temat lub co mogę zrobić?
devautor

Przepraszamy, nie ma tu łatwej odpowiedzi; próbuję tylko zdiagnozować twoje problemy. Śledzenie jest nieoczekiwane i wskazuje na konflikt między wersjami. Dlatego normalnie requestsi piposadzaj ich zależności. Twoje śledzenie pokazuje, że żadne wbudowane wersje nie są używane, ale dlaczego tak jest, nie wiem.
Martijn Pieters

Odpowiedzi:


87

Ubuntu zawiera wersję PIP z prekambrianu i dlatego musisz ją zaktualizować, jeśli nie chcesz spędzać godzin na debugowaniu problemów związanych z pip.

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

Jak zauważyłeś, dołączyłem informacje zarówno dla Pythona 2.x, jak i 3.x


2
Wykonywanie operacji get-pip.py w Pythonie kończy się niepowodzeniem z powodu błędu „OSError: [Errno 13] Odmowa uprawnień: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'”
devautor

2
@mirror, użyj sudo, ponieważ get-pip.py spróbuje zainstalować pip
Raghuram Vadapalli

45
Ten problem nie ma nic wspólnego z pip. ślad stosu pokazuje, że żądanie pobrania pakietu kończy się niepowodzeniem, co wskazuje na problem z siecią. Nakazanie OP, aby ponownie zainstalował pip, będzie tylko objazdem.
Thom

2
to jest właściwa odpowiedź, winowajcą jest kanoniczne łatanie, pipktóre nie zostało naprawione od kilku wydań: github.com/pypa/pip/issues/4779
lurscher

2
Użyłem go na raspberian. Nie można już uruchomić „pip”. Można uruchomić tylko pip3. Musiałem dodać dowiązanie symboliczne: ln -s / usr / local / bin / pip / usr / bin / pip wzięte (i zmodyfikowane) z tej odpowiedzi: stackoverflow.com/questions/29712519/ ...
TheTrowser

37

Jeśli korzystasz z serwera proxy, przed rozpoczęciem instalacji musisz wykonać dodatkowe czynności konfiguracyjne. Musisz ustawić zmienną środowiskową http_proxy na adres proxy. Używając basha, można to zrobić za pomocą polecenia

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

Możesz również podać

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

parametr do pip. [user:pass@]Część jest opcjonalne.


25

Aktualizacja setuptools wyszła mi dobrze.

sudo pip install --upgrade setuptools

Dla mnie też zadziałało. Właściwie po zrobieniu tego zdałem sobie sprawę, że błędy pojawiały się po: Collecting setuptools (from kiwisolver> = 1.0.1-> matplotlib)
mayid

3
To zadziałało również dla mnie na Raspian Stretch. Proszę, zaakceptuj tę odpowiedź, aby ułatwić znalezienie
Sam Hammamy

potrzebował restartu po tym, aby upiec go z Raspbianem
Pipo

4
To polecenie powoduje ten sam błąd TypeError w Debianie9. To nie jest rozwiązanie uniwersalne.
sir__finley

15

Przede wszystkim ten problem występuje z powodu problemów z siecią, a odinstalowanie i ponowne zainstalowanie wszystkiego nie będzie zbyt pomocne. Prawdopodobnie znajdujesz się za proxy iw takim przypadku musisz ustawić proxy.

Ale w moim przypadku miałem problem, ponieważ nie korzystałem z serwera proxy. Generalnie pracuję za proxy, ale podczas pracy w domu ustawiam proxy na Brak w ustawieniach sieci.

Ale nadal otrzymywałem te same błędy, nawet po usunięciu ustawień proxy.

Więc kiedy pisałem

env | grep proxy

Znalazłem coś takiego:

http_proxy=http://127.0.0.1:1234/

I to był powód, dla którego nadal otrzymywałem ten sam błąd, nawet gdy myślałem, że usunąłem ustawienia proxy.

Aby usunąć ten serwer proxy, wpisz

unset http_proxy

Postępuj w ten sam sposób w przypadku wszystkich innych wpisów, takich jak https_proxy.


14

Dzieje się tutaj tak, że wersje request / urllib3 sprzedawane kolidują po zaimportowaniu w dwóch różnych miejscach (ten sam kod, ale różne nazwy). Jeśli następnie wystąpi błąd sieci, nie będzie ponawiać próby pobrania kierownicy, ale zakończy się niepowodzeniem z powyższym błędem. Zobacz tutaj, aby dokładniej zapoznać się z tym błędem.

Rozwiązanie z systemem pip, patrz powyżej .

Jeśli masz ten problem w virtualenv zbudowanym przez python -m venv(który nadal kopiuje koła /usr/share/python-wheels, nawet jeśli masz zainstalowany oddzielnie pip), najłatwiejszym sposobem "naprawy" wydaje się być:

  1. utwórz virtualenv: /usr/bin/python3.6 -m venv ...
  2. zainstalować requestsw środowisku (może to spowodować powyższy błąd):<venv>/bin/pip install requests
  3. usuń skopiowane wersje, requestsktóre będą używane przez pip:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Teraz a <venv>/bin/pipużywa zainstalowanej wersji, requestsktórej sprzedał urllib3.


Dzięki, właśnie to usunąłem /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whli teraz jest naprawione (bez virtualenv).
krsoni

Właściwie w moim przypadku nie używałem wirtualnego środowiska env.
krsoni

Jeśli usuniesz pliki whl bezpośrednio w /usr/share/python-wheels, python -m venvnie utworzy <venv>/bin/pip już użytecznych . Więc jeśli usuniesz te pliki, powinieneś być pewien, że ich nie potrzebujesz. Jeśli potrzebujesz zarówno systemowego pip, jak i venv pip, musisz zainstalować systemowy z get-pip.py(patrz stackoverflow.com/a/37531821/1380673 ) i musisz usunąć pliki whl z każdego venv.
Jan Katins

7

port 443 nie jest otwarty, po prostu zezwól na niestandardowy port 443 tcp, jeśli na AWS w innym przypadku otwórz port 443 dla połączeń wychodzących ...


To bardzo mi pomogło w moim klastrze OpenStack !! Dobry Deepak!
Arun Das

5

Po prostu uaktualnij pip działał dla mnie:

pip install --upgrade pip


5
błąd przydarzył mi się podczas wykonywania tego bardzo dokładnego polecenia :(
allan.simon

Naprawił błąd w Raspbian Sketch Lite.
Raúl Salinas-Monteagudo

1
Używam też Raspian Stretch Lite i to nie naprawiło błędu.
Stefan Wegener

Zgadzam się, że to zadziałało pięknie „python -m pip install --upgrade pip”
imbatman

2

Mam ten sam problem podczas instalacji RaspberryPI TFT od Adafruit z pitft.sh / adafruit-pitft.sh .

Nie podoba mi się kodowanie stylów z błędami skądś, które można jakoś zinterpretować - jak widać po poprzednich odpowiedziach.

Uwaga: Wyjątek błędu typu w retry.py jest oczywiście błędem spowodowanym niewłaściwym przypisaniem i obliczeniem instancji klasy Odpowiedz na int z domyślną wartością 10 - gdzieś w kodzie ... Powinien zostać również naprawiony dodając operator w miejscu lub naprawiając błędne przypisanie.

Więc najpierw próbował przeanalizować i załatać sam błąd. Rzeczywisty błąd w moim przypadku jest taki sam - wywołanie retry.py przez pip .

Skrypt instalacyjny adafruit-pitft.sh / pitft.sh próbuje zastosować urllib3, który sam próbuje zainstalować zagnieżdżone zależności przez pip , więc ten sam błąd.

adafruit-pitft.sh # lub pitft.sh

...

_stacktrace = sys.exc_info () [2]) File "/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / util / retry.py", wiersz 228, w przyrost

łącznie - = 1

TypeError: nieobsługiwane typy operandów dla - =: „Ponów próbę” i „int”

Dla aktualnej dystrybucji (opartej na debian-9.6.0 / stretch):

Plik „/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py”, wiersz 315, w inkrementacji

łącznie - = 1

TypeError: nieobsługiwane typy operandów dla - =: „Ponów próbę” i „int”

Następujące - dirty * :) - patch włącza brzmiące śledzenie błędów:

# 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

Brzmiący wynik z tymczasową poprawką to (wyświetlany dwukrotnie ...?):

Ponawianie (Retry (total = 1, connect = None, read = None, redirect = None)) po zerwaniu połączenia przez 'ConnectTimeoutError (<request.packages.urllib3.connection.VerifiedHTTPSConnection object at /

Ponawianie (Retry (total = 0, connect = None, read = None, redirect = None)) po zerwaniu połączenia przez 'ConnectTimeoutError (<request.packages.urllib3.connection.VerifiedHTTPSConnection object at /

Nie można znaleźć wersji spełniającej wymagania evdev (z wersji:)

Nie znaleziono pasującej dystrybucji dla evdev

OSTRZEŻENIE: Pip nie mógł zainstalować oprogramowania!

Więc w moim przypadku dwie rzeczy powodują błąd, może się to różnić w innych środowiskach:

  1. Brakujący evdev => spróbuj zainstalować
  2. Nie udało się połączyć repozytorium / dystrybucji zawierającej evdev w celu pobrania. => wreszcie daj spokój

Moje środowisko instalacyjne jest offline z wewnętrznego mirrora debian + raspbian, więc nie chcę ustawiać proxy ...

Więc przystąpiłem do ręcznej instalacji brakującego komponentu evdev :

  1. pobierz evdev z PyPI (lub np. z github.com):

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

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

  2. Rozpakuj i zainstaluj ręcznie jako użytkownik root - dla wszystkich kont lokalnych, więc wykryte jako zainstalowane:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    python setup.py install

  3. Wywołaj ponownie skrypt instalacyjny:

    adafruit-pitft.sh # lub pitft.sh

    ... Odpowiadaj na dialogi ...

    ...Otóż to.

Jeśli przejdziesz przez Internet przez bezpośredni dostęp PyPI :

  1. sprawdź swój routing + firewall, aby uzyskać dostęp do pypi.org

  2. ustaw proxy, jeśli jest to wymagane (http_proxy / https_proxy)

I to działa ...

Mam nadzieję, że to pomoże również w innych przypadkach.

Arno-Can Uestuensoez

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

Zobacz też: wydanie - 35334: https://bugs.python.org/issue35334

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

Zobacz teraz także: wydanie - 1486: https://github.com/urllib3/urllib3/issues/1486

dla pliku: https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py


2

sprawdź problemy z siecią, aby ominąć kod przypadku wyjątku

W moim przypadku korzystałem z indeksu niestandardowego, który nie miał trasy, a taki wywołałby kod przypadku wyjątku. Błąd przypadku wyjątku nadal istnieje i nadal maskuje prawdziwy problem, jednak udało mi się go obejść, testując łączność z innymi narzędziami, takimi jak nc -vzw1 myindex.example.org 443i ponawiając próbę, gdy sieć działała.


1

Miałem podobny problem podczas próby zainstalowania narzędzia awscli na instancji ec2. Zmieniłem grupę zabezpieczeń, aby zezwolić na dostęp przychodzący i wychodzący na porcie 443 i to rozwiązało problem.


To nie daje odpowiedzi na pytanie. Gdy zdobędziesz wystarczającą reputację , będziesz mógł komentować każdy post ; zamiast tego udziel odpowiedzi, które nie wymagają wyjaśnień od pytającego . - Z recenzji
Lukas Körfer

1
Czy teraz wygląda lepiej? Pomyślałem, że powinienem wspomnieć o tym, co uznałem za pomocne
Yogesh Gupta

1

Otrzymałem ten błąd, gdy próbowałem utworzyć virtualenvpolecenie za pomocą virtualenv myVirtualEnv. Właśnie dodałem sudoprzed poleceniem; rozwiązał wszystko.


To nie jest rozwiązanie: działam jako root w dockerze i mam ten sam problem. Nie wyjaśniasz też, dlaczego pomaga bieganie jako root.
Eric

1
@ Eric, właśnie użyłem metody try & error; Nie znam podstawowego celu. U mnie zadziałało, więc zasugerowałem.
Zeinab Abbasimazar

1

Rozwiązanie:
1. sudo apt remove python-pip
2. pip3 install pip(lub zainstaluj pip przez get-pip.py )

Dlaczego:
Ten błąd wystąpił w pip 8.0.1 zainstalowanym przez apt-get. I stało się tylko wtedy, gdy twoja sieć jest niestabilna.

Jeśli masz zainstalowany pip z apt, ukrywa on zainstalowany przez ciebie pip w inny sposób, więc powinieneś najpierw usunąć apt.

Odłączyłem sieć i przetestowałem 8.0.1, 9.0.3, 10.x 3 wersje zainstalowane z pip3 lub get-pip.py, nie wystąpił błąd. Więc myślę, że tylko apt wersja pip 8.0.1 ma ten błąd, inne są w porządku.


1

W moim przypadku otworzyłem Pycharm w trybie sudo i uruchomiłem pip install nltk w terminalu pycharm, który pokazał ten błąd. uruchomienie z instalacją sudo pip rozwiązuje błąd.


0

Ja też miałem ten problem. Początkowo proxy było ustawione i działa dobrze. Następnie połączyłem się z siecią, w której nie przechodzi przez proxy. Po rozbrojeniu proxy pip ponownie pobierz działa.

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY

0

Dziwnie, jeśli usunę proxy ze środowiska i dodam go do wiersza poleceń, to działa. Na przykład, aby zaktualizować pipsię:

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

Mój problem polegał na tym, że serwer proxy był w środowisku. Wygląda na to, że pip honoruje tylko argumentującego.


0

To jest działające rozwiązanie tego problemu, które znalazłem.

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

Dla mnie okazuje się, że wlan0 nie działa, przez co nie mogę się połączyć. Tak więc, upewniając się, że wlan0 działa, pozwolono pip / pip3 na bezproblemową pracę.


0

Wypróbowałem rozwiązanie, na które odpowiedziano powyżej:

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

Kiedy próbowałem

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

Dostałem tę wiadomość

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

Wykonałem następujące czynności i działa

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.