L'installazione PIP di Python genera TypeError: tipi di operandi non supportati per - =: 'Retry' e 'int'


107

L'utilizzo pip installdi qualsiasi modulo apparentemente sul mio sistema Ubuntu 16.04 con python 2.7.11+ genera questo errore:

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

Cosa c'è di sbagliato in pip? Come potrei reinstallarlo, se necessario?

Aggiornamento: il traceback completo è di seguito

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 Certo, aggiungendo queste informazioni
devautor

Allora da dove vengono quelle ruote? pipnormalmente userebbe un requestspacchetto incorporato e requestsnormalmente userebbe un urllib3pacchetto incorporato . Quelle ruote non sono versioni incorporate e probabilmente sono incompatibili con la pipsottoclasse di parte di questo codice. spostarsi /usr/share/python-wheelsforse?
Martijn Pieters

Mi aspetto pipdi usare pip/_vendor/requests/e pip/_vendor/requests/packages/urllib3/, non /usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requestso /usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3.
Martijn Pieters

Non ne ho assolutamente idea! Dove dovrei cercare informazioni su questo o cosa potrei fare?
devautor

Spiacenti, nessuna risposta facile qui; sto solo cercando di diagnosticare i tuoi problemi. Il traceback è inaspettato e indica uno scontro tra le versioni. Ecco perché normalmente requestse pipincorporano le loro dipendenze. Il tuo traceback mostra che le versioni incorporate non vengono utilizzate, ma non lo so perché .
Martijn Pieters

Risposte:


87

Ubuntu viene fornito con una versione di PIP di precambrian ed è così che devi aggiornarlo se non vuoi passare ore e ore a eseguire il debug di problemi relativi a pip.

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

Come hai notato, ho incluso informazioni sia per Python 2.x che per 3.x


2
L'esecuzione di python get-pip.py fallisce con questo "OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'"
devautor

2
@mirror, usa sudo perché get-pip.py proverà a installare pip
Raghuram Vadapalli

45
Questo problema non ha nulla a che fare con pip. l'analisi dello stack mostra che la richiesta di ottenere il pacchetto non riesce, indicando un problema di rete. Dire all'OP di reinstallare pip sarà solo una deviazione.
Thom

2
questa è la risposta giusta, il colpevole è la patch canonica pipche è rimasta non risolta per diverse versioni ora: github.com/pypa/pip/issues/4779
lurscher

2
L'ho usato su Raspberian. Impossibile eseguire "pip" più. Potrebbe eseguire solo pip3. Ho dovuto aggiungere un link simbolico: ln -s / usr / local / bin / pip / usr / bin / pip preso (e modificato) da questa risposta: stackoverflow.com/questions/29712519/...
TheTrowser

37

Se sei dietro un proxy, devi eseguire alcuni passaggi di configurazione aggiuntivi prima di avviare l'installazione. È necessario impostare la variabile di ambiente http_proxy sull'indirizzo proxy. Usando bash questo si ottiene con il comando

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

Puoi anche fornire il file

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

parametro a pip. La [user:pass@]porzione è facoltativa.


25

L'aggiornamento di setuptools ha funzionato bene per me.

sudo pip install --upgrade setuptools

Ha funzionato anche per me. In realtà, dopo averlo fatto, mi sono reso conto che gli errori apparivano dopo: Raccolta di setuptools (da kiwisolver> = 1.0.1-> matplotlib)
mayid

3
Questo ha funzionato anche per me su un Raspian Stretch. Si prega di accettare questa risposta per renderla più facile da trovare
Sam Hammamy

aveva bisogno di un riavvio dopo che per farlo funzionare con raspbian
Pipo

4
Questo comando causa lo stesso TypeError per me su Debian9. Questa non è una soluzione universale.
sir__finley

15

Prima di tutto, questo problema esiste a causa di problemi di rete e disinstallare e reinstallare tutto non sarà di grande aiuto. Probabilmente sei dietro proxy, e in tal caso devi impostare il proxy.

Ma nel mio caso, stavo affrontando il problema perché non ero dietro al proxy. In genere, lavoro dietro proxy, ma quando lavoro da casa, imposto il proxy su Nessuno nelle impostazioni di rete.

Ma ricevevo ancora gli stessi errori anche dopo aver rimosso le impostazioni del proxy.

Quindi, quando ho digitato

env | grep proxy

Ho trovato qualcosa di simile:

http_proxy=http://127.0.0.1:1234/

E questo era il motivo per cui ricevevo ancora lo stesso errore, anche quando pensavo di aver rimosso le impostazioni del proxy.

Per annullare l'impostazione di questo proxy, digita

unset http_proxy

Segui lo stesso approccio per tutte le altre voci, ad esempio https_proxy.


14

Quello che succede qui è che le versioni vendute di request / urllib3 si scontrano quando vengono importate in due posti diversi (stesso codice, ma nomi diversi). Se si verifica un errore di rete, non si riprova a ottenere la ruota, ma non riesce con l'errore precedente. Vedi qui per un'analisi più approfondita di questo errore.

Per la soluzione con pip di sistema, vedere sopra .

Se hai questo problema in un virtualenv costruito da python -m venv(che copia ancora le ruote da /usr/share/python-wheels, anche se hai pip installato separatamente), il modo più semplice per "risolverlo" sembra essere:

  1. creare il virtualenv: /usr/bin/python3.6 -m venv ...
  2. installare requestsnell'ambiente (questo potrebbe generare l'errore precedente):<venv>/bin/pip install requests
  3. rimuovere le versioni copiate di requestscui verrebbero utilizzate da pip:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Ora <venv>/bin/piputilizza la versione installata di requestscui è in vendita urllib3.


Grazie, l'ho appena rimosso /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whle ora è stato risolto (senza virtualenv).
krsoni

In realtà nel mio caso, non stavo usando l'env virtuale.
krsoni

Se rimuovi i file whl direttamente in /usr/share/python-wheels, python -m venvnon creerà più un file utilizzabile <venv>/bin/pip . Quindi se rimuovi questi file dovresti essere sicuro di non averne bisogno. Se hai bisogno sia di un pip di sistema che di un pip venv, devi installare quello di sistema con get-pip.py(Vedi stackoverflow.com/a/37531821/1380673 ) e devi rimuovere i file whl in ogni venv.
Jan Katins

7

la porta 443 non è aperta, è sufficiente consentire la porta tcp personalizzata 443 se su AWS altrimenti aprire la porta 443 per le connessioni in uscita ...


Questo mi ha aiutato molto nel mio cluster OpenStack !! Bravo Deepak!
Arun Das

5

Basta aggiornare pip ha funzionato per me:

pip install --upgrade pip


5
l'errore mi è capitato durante l'esecuzione di questo comando molto preciso :(
allan.simon

Ha corretto l'errore per me su un Raspbian Sketch Lite.
Raúl Salinas-Monteagudo

1
Sto anche eseguendo Raspian Stretch Lite e non ha risolto l'errore.
Stefan Wegener

Concordo che ha funzionato magnificamente "python -m pip install --upgrade pip"
imbatman

2

Ho lo stesso problema durante l'installazione di un TFT RaspberryPI da Adafruit con pitft.sh / adafruit-pitft.sh .

Non sono contento degli stili di codifica con errori da qualche parte da interpretare in qualche modo, come si può vedere dalle risposte precedenti.

Nota: l'eccezione di errore di tipo di retry.py è ovviamente un bug, causato da un'assegnazione e dal calcolo non appropriati di un'istanza della classe Rispondi a un int con il valore predefinito di 10 - da qualche parte nel codice ... Dovrebbe essere corretto o aggiungendo un operatore inplace o correggendo l'assegnazione errata.

Quindi ho provato prima ad analizzare e correggere l'errore stesso. L'errore effettivo nel mio caso è lo stesso: retry.py chiamato da pip .

Lo script di installazione adafruit-pitft.sh / pitft.sh cerca di applicare urllib3 che a sua volta cerca di installare dipendenze annidate tramite pip , quindi lo stesso errore.

adafruit-pitft.sh # o 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", riga 228, in incremento

totale - = 1

TypeError: tipi di operandi non supportati per - =: 'Retry' e 'int'

Per la distribuzione corrente (basata su debian-9.6.0 / stretch):

File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", riga 315, in incrementi

totale - = 1

TypeError: tipi di operandi non supportati per - =: 'Retry' e 'int'

Il seguente - sporco * :) - patch abilita una traccia di errore che suona:

# 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

L'uscita del suono con la patch temporanea è (visualizzata due volte ...?):

Nuovo tentativo (Riprova (totale = 1, connessione = Nessuno, lettura = Nessuno, reindirizzamento = Nessuno)) dopo l'interruzione della connessione da 'ConnectTimeoutError (<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at /

Nuovo tentativo (Riprova (totale = 0, connessione = Nessuno, lettura = Nessuno, reindirizzamento = Nessuno)) dopo l'interruzione della connessione da 'ConnectTimeoutError (<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at /

Impossibile trovare una versione che soddisfi il requisito evdev (dalle versioni :)

Nessuna distribuzione corrispondente trovata per evdev

ATTENZIONE: Pip non è riuscito a installare il software!

Quindi nel mio caso in realtà due cose causano l'errore, questo può variare in altri ambienti:

  1. Manca evdev => prova ad installare
  2. Impossibile connettere un repository / dist contenente evdev per il download. => finalmente rinunciare

Il mio ambiente di installazione è offline da un mirror interno debian + raspbian, quindi non voglio impostare il proxy ...

Quindi ho proceduto con l'installazione manuale del componente mancante evdev :

  1. scarica evdev da PyPI (o ad esempio da github.com):

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

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

  2. Disimballare e installare manualmente come utente root - per tutti gli account locali, quindi rilevati come installati:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    installazione di python setup.py

  3. Chiama di nuovo lo script di installazione:

    adafruit-pitft.sh # o pitft.sh

    ... Rispondi ai dialoghi ...

    ...questo è tutto.

Se procedi online tramite accesso diretto PyPI :

  1. controlla il tuo routing + firewall per accedere a pypi.org

  2. imposta un proxy se richiesto (http_proxy / https_proxy)

E funziona ..

Spero che questo aiuti anche in altri casi.

Arno-Can Uestuensoez

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

Vedi anche: problema - 35334: https://bugs.python.org/issue35334

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

Vedi ora anche: problema - 1486: https://github.com/urllib3/urllib3/issues/1486

per file: https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py


2

verificare la presenza di problemi di rete, per ignorare il codice del caso di eccezione

Nel mio caso, stavo usando un indice personalizzato, quell'indice non aveva percorso e tale avrebbe attivato il codice del caso di eccezione. Il bug del caso di eccezione esiste ancora e maschera ancora il vero problema, tuttavia sono stato in grado di aggirare questo problema testando la connettività con altri strumenti come nc -vzw1 myindex.example.org 443e riprovando quando la rete era attiva.


1

Stavo affrontando un problema simile durante il tentativo di installare lo strumento awscli sull'istanza ec2. Ho cambiato il gruppo di sicurezza per consentire l'accesso in entrata e in uscita alla porta 443 e questo ha risolto il problema per me.


Questo non fornisce una risposta alla domanda. Una volta che avrai una reputazione sufficiente, potrai commentare qualsiasi post ; fornire invece risposte che non richiedono chiarimenti da parte del richiedente . - Dalla recensione
Lukas Körfer

1
Sembra meglio adesso? Ho solo pensato di menzionare ciò che ho trovato utile
Yogesh Gupta

1

Ho ricevuto questo errore quando stavo cercando di creare un virtualenvcomando with virtualenv myVirtualEnv. Ho appena aggiunto un sudoprima del comando; ha risolto tutto.


Non è una soluzione: corro come root nella finestra mobile e ho lo stesso problema. Inoltre non spieghi perché correre come root aiuta.
Eric

1
@Eric, ho appena usato l'approccio try & error; Non conosco lo scopo sottostante. Ha funzionato per me, quindi ho suggerito.
Zeinab Abbasimazar

1

Soluzione:
1. sudo apt remove python-pip
2. pip3 install pip(o installa pip da get-pip.py )

Perché:
questo errore si è verificato su pip 8.0.1 installato da apt-get. Ed è successo solo quando la tua rete è instabile.

Se hai un pip installato con apt, nasconde il pip che hai installato in altri modi, quindi dovresti rimuovere prima quello apt.

Ho disconnesso la rete e testato 8.0.1, 9.0.3, 10.x le 3 versioni installate con pip3 o get-pip.py, non si è verificato alcun errore. Quindi, penso che solo la versione apt di pip 8.0.1 abbia quel bug, le altre sono ok.


1

Nel mio caso, avevo aperto Pycharm in modalità sudo e stavo eseguendo pip install nltk nel terminale pycharm che mostrava questo errore. l'esecuzione con sudo pip install risolve l'errore.


0

Ho avuto anche questo problema. Inizialmente, è stato impostato un proxy e funziona bene. Quindi mi sono connesso a una rete dove non passa attraverso un proxy. Dopo aver disattivato nuovamente il proxy, il pip funziona.

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY

0

Stranamente se rimuovo il proxy dall'ambiente e lo aggiungo alla riga di comando per me funziona. Ad esempio per aggiornare pipse stesso:

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

Il mio problema era avere il proxy nell'ambiente. Sembra che pip onori solo quello in discussione.


0

Questa è la soluzione di lavoro a questo problema che ho trovato.

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

Per quanto mi riguarda, risulta che wlan0 era inattivo, il che mi ha impedito di connettermi. Quindi, assicurandosi che wlan0 fosse attivo, ha permesso a pip / pip3 di funzionare senza problemi.


0

Ho provato la soluzione risposta sopra:

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

Quando ho provato

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

Ho ricevuto questo messaggio

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

Ho fatto quanto segue e funziona

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.