Python PIP Install löst TypeError aus: Nicht unterstützte Operandentypen für - =: 'Retry' und 'int'

106

Die Verwendung pip installfür ein beliebiges Modul auf meinem Ubuntu 16.04-System mit Python 2.7.11+ löst diesen Fehler aus:

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

Was ist los mit pip? Wie kann ich es bei Bedarf neu installieren?

Update: Vollständiger Traceback ist unten

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'
Devautor
quelle
@ MartinijnPieters Sicher, diese Informationen
anhängen
Woher kamen diese Räder? pipNormalerweise würde ein eingebettetes requestsPaket verwendet, und requestsnormalerweise würde ein eingebettetes urllib3Paket verwendet. Diese Räder sind keine eingebetteten Versionen und wahrscheinlich nicht mit der pipUnterklasse einiger dieser Codes kompatibel . bewegen /usr/share/python-wheelsbeiseite vielleicht?
Martijn Pieters
Ich würde erwarten pip, pip/_vendor/requests/und pip/_vendor/requests/packages/urllib3/, nicht /usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requestsoder zu verwenden /usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3.
Martijn Pieters
Ich habe überhaupt keine Ahnung davon! Wo soll ich nach Informationen dazu suchen oder was könnte ich tun?
Devautor
Entschuldigung, keine einfache Antwort hier; Ich versuche nur, Ihre Probleme zu diagnostizieren. Der Traceback ist unerwartet und weist auf einen Konflikt zwischen den Versionen hin. Deshalb normal requestsund pipbettet ihre Abhängigkeiten ein. Ihr Traceback zeigt, dass keine eingebetteten Versionen verwendet werden, aber warum das so ist, weiß ich nicht.
Martijn Pieters

Antworten:

86

Ubuntu wird mit einer PIP-Version von Precambrian geliefert. Auf diese Weise müssen Sie ein Upgrade durchführen, wenn Sie nicht stundenlang Probleme mit Pips beheben möchten.

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

Wie Sie bemerkt haben, habe ich Informationen für Python 2.x und 3.x hinzugefügt

Sorin
quelle
2
Das Ausführen von python get-pip.py schlägt mit diesem "OSError: [Errno 13] Berechtigung verweigert: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'"
fehl
2
@ Spiegel, verwenden Sie sudo, weil get-pip.py versucht, pip zu installieren
Raghuram Vadapalli
45
Dieses Problem hat nichts mit pip zu tun. Die Stapelverfolgung zeigt an, dass die Anforderung zum Abrufen des Pakets fehlschlägt, was auf ein Netzwerkproblem hinweist. Das OP anzuweisen, pip neu zu installieren, ist nur ein Umweg.
Thom
2
Dies ist die richtige Antwort. Der Schuldige ist das kanonische Patchen pip, das seit mehreren Veröffentlichungen nicht mehr
behoben wurde
2
Verwendet es auf Himbeer. "Pip" konnte nicht mehr ausgeführt werden. Konnte nur pip3 ausführen. Ich musste einen symbolischen Link hinzufügen: ln -s / usr / local / bin / pip / usr / bin / pip aus dieser Antwort entnommen (und geändert): stackoverflow.com/questions/29712519/…
TheTrowser
36

Wenn Sie sich hinter einem Proxy befinden, müssen Sie einige zusätzliche Konfigurationsschritte ausführen, bevor Sie mit der Installation beginnen. Sie müssen die Umgebungsvariable http_proxy auf die Proxy-Adresse setzen. Mit bash wird dies mit dem Befehl erreicht

export http_proxy="http://user:[email protected]:port/" 

Sie können auch die

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

Parameter zu pip. Der [user:pass@]Teil ist optional.

Livruen Nati
quelle
24

Das Aktualisieren von setuptools hat für mich gut funktioniert.

sudo pip install --upgrade setuptools
Matheswaran Kanagarajan
quelle
Hat auch für mich gearbeitet. Nachdem ich dies getan hatte, stellte ich fest, dass die Fehler früher auftraten: Sammeln von Setuptools (von Kiwisolver> = 1.0.1-> Matplotlib)
Mayid
3
Dies funktionierte auch für mich auf einer Raspian Stretch. Bitte akzeptieren Sie diese Antwort, um das Auffinden zu erleichtern
Sam Hammamy
brauchte danach einen Neustart, um es mit Raspbian zu backen
Pipo
4
Dieser Befehl verursacht für mich unter Debian9 denselben TypeError. Dies ist keine universelle Lösung.
sir__finley
15

Erstens besteht dieses Problem aufgrund von Netzwerkproblemen, und die Deinstallation und Neuinstallation von allem ist keine große Hilfe. Wahrscheinlich stehen Sie hinter dem Proxy, und in diesem Fall müssen Sie den Proxy festlegen.

Aber in meinem Fall stand ich vor dem Problem, weil ich nicht hinter dem Proxy stand. Im Allgemeinen arbeite ich hinter dem Proxy, aber wenn ich von zu Hause aus arbeite, setze ich den Proxy in den Netzwerkeinstellungen auf Keine.

Aber ich bekam immer noch die gleichen Fehler, selbst nachdem ich die Proxy-Einstellungen entfernt hatte.

Also, als ich getippt habe

env | grep proxy

Ich habe so etwas gefunden:

http_proxy=http://127.0.0.1:1234/

Und dies war der Grund, warum ich immer noch den gleichen Fehler bekam, selbst wenn ich dachte, ich hätte die Proxy-Einstellungen entfernt.

Geben Sie Folgendes ein, um diesen Proxy zu deaktivieren

unset http_proxy

Gehen Sie für alle anderen Einträge wie https_proxy genauso vor.

thisisashwani
quelle
14

Was hier passiert, ist, dass die verkauften Versionen von request / urllib3 beim Import an zwei verschiedenen Stellen (gleicher Code, aber unterschiedliche Namen) zusammenstoßen. Wenn Sie dann einen Netzwerkfehler haben, wird nicht versucht, das Rad zu erhalten, sondern der oben genannte Fehler schlägt fehl. Siehe hier für ein tieferes Eintauchen in diesen Fehler.

Für die Lösung mit Systempip siehe oben .

Wenn Sie dieses Problem in einer virtuellen Umgebung haben, die von erstellt wurde python -m venv(die die Räder immer noch kopiert /usr/share/python-wheels, selbst wenn Sie Pip separat installiert haben), scheint der einfachste Weg, dies zu "beheben", zu sein:

  1. Erstellen Sie die virtuelle Umgebung: /usr/bin/python3.6 -m venv ...
  2. Installation requestsin der Umgebung (dies kann den obigen Fehler auslösen):<venv>/bin/pip install requests
  3. Entfernen Sie die kopierten Versionen requests, die von pip verwendet werden:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Jetzt <venv>/bin/pipverwendet a die installierte Version, von requestsder urllib3 verkauft wurde.

Jan Katins
quelle
Danke, ich habe das gerade entfernt /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whlund es ist jetzt behoben (ohne virtualenv).
Krsoni
In meinem Fall habe ich die virtuelle Umgebung nicht verwendet.
Krsoni
Wenn Sie die whl-Dateien direkt in entfernen /usr/share/python-wheels, python -m venvwird keine verwendbare <venv>/bin/pip mehr erstellt. Wenn Sie diese Dateien entfernen, sollten Sie sicher sein, dass Sie sie nicht benötigen. Wenn Sie sowohl einen System-Pip als auch einen Venv-Pip benötigen, müssen Sie den System-Pip mit get-pip.py(siehe stackoverflow.com/a/37531821/1380673 ) installieren und die whl-Dateien in jedem Venv entfernen.
Jan Katins
7

Port 443 ist nicht geöffnet. Lassen Sie einfach den benutzerdefinierten TCP-Port 443 zu, wenn Sie unter AWS den Port 443 für die ausgehenden Verbindungen öffnen.

Deepak
quelle
Das hat mir sehr geholfen in meinem OpenStack-Cluster !! Guter Deepak!
Arun Das
5

Nur Upgrade Pip hat bei mir funktioniert:

pip install --upgrade pip

Cleicar
quelle
5
Der Fehler passiert mir beim Ausführen dieses sehr genauen Befehls :(
allan.simon
Es hat den Fehler für mich auf einem Raspbian Sketch Lite behoben.
Raúl Salinas-Monteagudo
1
Ich verwende auch Raspian Stretch Lite und es hat den Fehler nicht behoben.
Stefan Wegener
Ich stimme zu, dass dies wunderbar funktioniert hat "python -m pip install --upgrade pip"
imbatman
2

Ich habe das gleiche Problem bei der Installation eines RaspberryPI TFT von Adafruit mit pitft.sh / adafruit-pitft.sh .

Ich bin nicht glücklich über Codierungsstile mit Fehlern von irgendwoher, die irgendwie interpretiert werden können - wie aus den vorherigen Antworten hervorgeht.

Anmerkung: Die Typfehlerausnahme von retry.py ist offensichtlich ein Fehler, der durch eine unangemessene Zuweisung und Berechnung einer Instanz der Klasse Reply to a int mit dem Standardwert 10 verursacht wird - irgendwo im Code ... Sollte auch behoben werden durch Hinzufügen eines Inplace-Operators oder Korrigieren der fehlerhaften Zuordnung.

Also habe ich zuerst versucht, den Fehler selbst zu analysieren und zu patchen. Der eigentliche Fehler in meinem Fall ist der gleiche - retry.py wird von pip aufgerufen .

Das Installationsskript adafruit-pitft.sh / pitft.sh versucht, urllib3 anzuwenden, das selbst versucht, verschachtelte Abhängigkeiten von pip zu installieren , also der gleiche Fehler.

adafruit-pitft.sh # oder pitft.sh

...

_stacktrace = sys.exc_info () [2]) Datei "/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / util / retry.py", Zeile 228, in Zuwachs

gesamt - = 1

TypeError: Nicht unterstützte Operandentypen für - =: 'Retry' und 'int'

Für die aktuelle Distribution (basierend auf Debian-9.6.0 / Stretch):

Datei "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", Zeile 315, inkrementell

gesamt - = 1

TypeError: Nicht unterstützte Operandentypen für - =: 'Retry' und 'int'

Der folgende - schmutzige * :) - Patch aktiviert eine klingende Fehlersuche:

# 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

Die klingende Ausgabe mit dem temporären Patch ist (zweimal angezeigt ...?):

Wiederholen (Wiederholen (Gesamt = 1, Verbinden = Keine, Lesen = Keine, Umleiten = Keine)) nach Verbindungsunterbrechung durch 'ConnectTimeoutError (<request.packages.urllib3.connection.VerifiedHTTPSConnection-Objekt bei /

Wiederholen (Wiederholen (Gesamt = 0, Verbinden = Keine, Lesen = Keine, Umleiten = Keine)) nach Verbindungsunterbrechung durch 'ConnectTimeoutError (<request.packages.urllib3.connection.VerifiedHTTPSConnection-Objekt bei /

Es konnte keine Version gefunden werden, die die Anforderung evdev erfüllt (aus Versionen :)

Für evdev wurde keine passende Verteilung gefunden

WARNUNG: Pip konnte die Software nicht installieren!

In meinem Fall verursachen zwei Dinge den Fehler. Dies kann in anderen Umgebungen variieren:

  1. Fehlende evdev => versuchen zu installieren
  2. Fehler beim Verbinden eines Repo / Dist mit evdev zum Herunterladen. => gib es endlich auf

Meine Installationsumgebung ist offline von einem internen Debian + Raspbian-Spiegel, daher möchten Sie den Proxy nicht festlegen ...

Also fuhr ich mit der manuellen Installation der fehlenden Komponente evdev fort :

  1. evdev von PyPI herunterladen (oder zB von github.com):

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

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

  2. Entpacken und manuell als Root- Benutzer installieren - für alle lokalen Konten, die als installiert erkannt wurden:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    python setup.py installieren

  3. Rufen Sie das Installationsskript erneut auf:

    adafruit-pitft.sh # oder pitft.sh

    ... Dialoge beantworten ...

    ...das ist es.

Wenn Sie online über einen direkten PyPI- Zugriff fortfahren :

  1. Überprüfen Sie Ihr Routing + Ihre Firewall auf Zugriff auf pypi.org

  2. Legen Sie bei Bedarf einen Proxy fest (http_proxy / https_proxy).

Und es funktioniert..

Hoffe das hilft auch in anderen Fällen.

Arno-Can Uestuensoez

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

Siehe auch: Problem - 35334: https://bugs.python.org/issue35334

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

Siehe jetzt auch: Ausgabe - 1486: https://github.com/urllib3/urllib3/issues/1486

Für Datei: https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py

ein Hinweis
quelle
2

Suchen Sie nach Netzwerkproblemen, um den Ausnahmefallcode zu umgehen

In meinem Fall habe ich einen benutzerdefinierten Index verwendet, dieser Index hatte keine Route und würde den Ausnahmefallcode auslösen. Der Fehler im Ausnahmefall besteht immer noch und maskiert immer noch das eigentliche Problem. Ich konnte dies jedoch nc -vzw1 myindex.example.org 443umgehen, indem ich die Konnektivität mit anderen Tools testete und es erneut versuchte, wenn das Netzwerk aktiv war.

ThorSummoner
quelle
1

Beim Versuch, das awscli-Tool auf der ec2-Instanz zu installieren, trat ein ähnliches Problem auf. Ich habe die Sicherheitsgruppe geändert, um den eingehenden und ausgehenden Zugriff auf Port 443 zuzulassen, und das hat das Problem für mich gelöst.

Yogesh Gupta
quelle
Dies gibt keine Antwort auf die Frage. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren . Geben Sie stattdessen Antworten, die nicht vom Fragesteller geklärt werden müssen . - Aus dem Rückblick
Lukas Körfer
1
Sieht es jetzt besser aus? Ich dachte nur, ich sollte erwähnen, was ich hilfreich fand
Yogesh Gupta
1

Ich habe diesen Fehler erhalten, als ich versucht habe, einen virtualenvwith-Befehl zu erstellen virtualenv myVirtualEnv. Ich habe gerade sudovor dem Befehl ein hinzugefügt . es hat alles gelöst.

Zeinab Abbasimazar
quelle
Es ist keine Lösung: Ich laufe als Root im Docker und habe das gleiche Problem. Außerdem erklären Sie nicht, warum das Ausführen als Root hilfreich ist.
Eric
1
@ Eric, ich habe gerade den Try & Error-Ansatz verwendet. Ich kenne den zugrunde liegenden Zweck nicht. Es hat bei mir funktioniert, also schlug ich vor.
Zeinab Abbasimazar
1

Lösung:
1. sudo apt remove python-pip
2. pip3 install pip(oder installieren Sie pip mit get-pip.py )

Warum:
Dieser Fehler trat bei Pip 8.0.1 auf, das von apt-get installiert wurde. Und geschah nur, wenn Ihr Netzwerk instabil ist.

Wenn Sie einen Pip mit apt installiert haben, wird der von Ihnen installierte Pip auf andere Weise ausgeblendet. Entfernen Sie daher zuerst den apt.

Ich habe das Netzwerk getrennt und 8.0.1, 9.0.3, 10.x der 3 mit pip3 oder get-pip.py installierten Versionen getestet. Es ist kein Fehler aufgetreten. Ich denke, nur die passende Version von Pip 8.0.1 hat diesen Fehler, die anderen sind in Ordnung.

Haocheng Yang
quelle
1

In meinem Fall hatte ich Pycharm im Sudo-Modus geöffnet und führte pip install nltk im Pycharm-Terminal aus, was diesen Fehler zeigte. Das Ausführen mit sudo pip install behebt den Fehler.

Aayush Arora
quelle
0

Ich hatte auch dieses Problem. Zunächst wurde ein Proxy eingerichtet, der einwandfrei funktioniert. Dann habe ich mich mit einem Netzwerk verbunden, in dem es keinen Proxy gibt. Nach dem Deaktivieren von Proxy-Pip wieder funktioniert.

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY
GPrathap
quelle
0

Seltsamerweise funktioniert es für mich, wenn ich den Proxy aus der Umgebung entferne und ihn zur Befehlszeile hinzufüge. Zum Beispiel, um sich pipselbst zu aktualisieren :

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

Mein Problem war, den Proxy in der Umgebung zu haben. Es scheint, dass pip nur den Streitenden ehrt.

Eric
quelle
0

Dies ist die funktionierende Lösung für dieses Problem, das ich gefunden habe.

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
PSN
quelle
0

Für mich stellt sich heraus, dass wlan0 nicht verfügbar war, was dazu führte, dass ich keine Verbindung herstellen konnte. Um sicherzustellen, dass wlan0 aktiv war, konnte pip / pip3 problemlos funktionieren.

Japharl
quelle
0

Ich habe die oben beantwortete Lösung ausprobiert:

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

Als ich es versuchte

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

Ich habe diese Nachricht erhalten

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

Ich habe folgendes getan und es funktioniert

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
i_thamary
quelle