Python PIP Install arroja TypeError: tipos de operandos no admitidos para - =: 'Reintentar' e 'int'


106

El uso pip installpara cualquier módulo aparentemente en mi sistema Ubuntu 16.04 con python 2.7.11+ arroja este error:

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

¿Qué pasa con pip? ¿Cómo puedo reinstalarlo, si es necesario?

Actualización: el rastreo completo está debajo

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 Seguro, agregando esa información
devautor

Entonces, ¿de dónde vienen esas ruedas? pipnormalmente usaría un requestspaquete integrado , y requestsnormalmente usaría un urllib3paquete integrado . Esas ruedas no son versiones integradas y probablemente sean incompatibles con la pipsubclase de parte de este código. mover /usr/share/python-wheelsa un lado, tal vez?
Martijn Pieters

Esperaría pipusar pip/_vendor/requests/y pip/_vendor/requests/packages/urllib3/, no /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

¡No tengo ni idea de esto! ¿Dónde debería buscar información sobre esto o qué puedo hacer?
devautor

Lo siento, no hay una respuesta fácil aquí; tratando de diagnosticar sus problemas. El rastreo es inesperado y apunta a un conflicto entre versiones. Es por eso que normalmente requestse pipincrustan sus dependencias. Sus programas de rastreo cualquier incrustados no se están utilizando versiones, pero ¿por qué es que no sé.
Martijn Pieters

Respuestas:


86

Ubuntu viene con una versión de PIP de precambrian y así es como tienes que actualizarla si no quieres pasar horas y horas depurando problemas relacionados con pip.

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

Como observó, incluí información para Python 2.xy 3.x


2
Hacer python get-pip.py falla con este "OSError: [Errno 13] Permiso denegado: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'"
devautor

2
@mirror, use sudo porque get-pip.py intentará instalar pip
Raghuram Vadapalli

45
Este problema no tiene nada que ver con pip. el seguimiento de la pila muestra que la solicitud para obtener el paquete falla, lo que indica un problema de red. Decirle al OP que reinstale pip será solo un desvío.
Thom

2
esta es la respuesta correcta, el culpable es el parche canónico pipque ha permanecido sin corregir durante varios lanzamientos ahora: github.com/pypa/pip/issues/4779
lurscher

2
Lo usé en raspberian. Ya no se podía ejecutar "pip". Solo se pudo ejecutar pip3. Tuve que agregar un enlace simbólico: ln -s / usr / local / bin / pip / usr / bin / pip tomado (y modificado) de esta respuesta: stackoverflow.com/questions/29712519/…
TheTrowser

36

Si está detrás de un proxy, debe realizar algunos pasos de configuración adicionales antes de comenzar la instalación. Debe establecer la variable de entorno http_proxy en la dirección del proxy. Usando bash esto se logra con el comando

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

También puede proporcionar el

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

parámetro a pip. La [user:pass@]porción es opcional.


24

La actualización de setuptools ha funcionado bien para mí.

sudo pip install --upgrade setuptools

También funcionó para mí. En realidad, después de hacer esto, me di cuenta de que los errores solían aparecer después de: Recopilar herramientas de configuración (de kiwisolver> = 1.0.1-> matplotlib)
mayid

3
Esto también funcionó para mí en un Raspian Stretch. Acepte esta respuesta para que sea más fácil de encontrar
Sam Hammamy

necesitaba un reinicio después de eso para hornearlo y trabajar con raspbian
Pipo

4
Este comando me causa el mismo TypeError en Debian9. Esta no es una solución universal.
sir__finley

15

En primer lugar, este problema existe debido a problemas de red, y desinstalar y reinstalar todo no será de mucha ayuda. Probablemente esté detrás del proxy y, en ese caso, debe configurar el proxy.

Pero en mi caso, estaba enfrentando el problema porque no estaba detrás del proxy. Generalmente, trabajo detrás del proxy, pero cuando trabajo desde casa, configuro el proxy en Ninguno en la configuración de red.

Pero seguía recibiendo los mismos errores incluso después de eliminar la configuración del proxy.

Entonces, cuando escribí

env | grep proxy

Encontré algo como esto:

http_proxy=http://127.0.0.1:1234/

Y esta era la razón por la que seguía recibiendo el mismo error, incluso cuando pensé que había eliminado la configuración del proxy.

Para desarmar este proxy, escriba

unset http_proxy

Siga el mismo enfoque para todas las demás entradas, como https_proxy.


14

Lo que sucede aquí es que las versiones vendidas de request / urllib3 entran en conflicto cuando se importan en dos lugares diferentes (el mismo código, pero nombres diferentes). Si luego tiene un error de red, no vuelve a intentar obtener la rueda, pero falla con el error anterior. Consulte aquí para profundizar en este error.

Para la solución con pip del sistema, vea arriba .

Si tiene este problema en un virtualenv construido por python -m venv(que todavía copia las ruedas de /usr/share/python-wheels, incluso si tiene pip instalado por separado), la forma más fácil de "arreglarlo" parece ser:

  1. crea el virtualenv: /usr/bin/python3.6 -m venv ...
  2. instalar requestsen el entorno (esto podría generar el error anterior):<venv>/bin/pip install requests
  3. elimine las versiones copiadas requestsque usaría pip:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Ahora a <venv>/bin/pipusa la versión instalada de la requestsque se ha vendido urllib3.


Gracias, acabo de eliminar esto /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whly ya está arreglado (sin virtualenv).
krsoni

En realidad, en mi caso, no estaba usando el entorno virtual.
krsoni

Si elimina los archivos whl directamente /usr/share/python-wheels, python -m venvdejará de crear un archivo utilizable <venv>/bin/pip . Por lo tanto, si elimina estos archivos, debe asegurarse de que no los necesita. Si necesita tanto un pip de sistema como un pip de venv, debe instalar el sistema con uno get-pip.py(consulte stackoverflow.com/a/37531821/1380673 ) y debe eliminar los archivos whl en cada venv.
Jan Katins

7

el puerto 443 no está abierto, solo permita el puerto tcp personalizado 443 si en AWS, de lo contrario, abra el puerto 443 para las conexiones salientes ...


¡¡Esto me ayudó mucho en mi clúster OpenStack !! ¡Buen Deepak!
Arun Das

5

Solo actualizar pip funcionó para mí:

pip install --upgrade pip


5
el error me sucedió al ejecutar este comando muy exacto :(
allan.simon

Me solucionó el error en un Raspbian Sketch Lite.
Raúl Salinas-Monteagudo

1
También estoy ejecutando Raspian Stretch Lite y no solucionó el error.
Stefan Wegener

Estoy de acuerdo en que esto funcionó maravillosamente "python -m pip install --upgrade pip"
imbatman

2

Tengo el mismo problema al instalar un RaspberryPI TFT de Adafruit con pitft.sh / adafruit-pitft.sh .

No estoy contento con los estilos de codificación con errores de algún lugar para ser interpretados de alguna manera, como se pudo ver en las respuestas anteriores.

Observación: La excepción de error de tipo de retry.py es obviamente un error, causado por una asignación y cálculo inapropiados de una instancia de la clase Responder a un int con el valor predeterminado de 10 - en algún lugar del código ... Debería corregirse o bien agregando un operador inplace o arreglando la asignación errónea.

Así que primero intenté analizar y corregir el error. El error real en mi caso es el mismo: retry.py llamado por pip .

El script de instalación adafruit-pitft.sh / pitft.sh intenta aplicar urllib3, que a su vez intenta instalar dependencias anidadas por pip , por lo que el mismo error.

adafruit-pitft.sh # o pitft.sh

...

_stacktrace = sys.exc_info () [2]) Archivo "/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / util / retry.py", línea 228, en incremento

total - = 1

TypeError: tipos de operandos no admitidos para - =: 'Reintentar' e 'int'

Para la distribución actual (basada en debian-9.6.0 / stretch):

Archivo "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", línea 315, en incrementos

total - = 1

TypeError: tipos de operandos no admitidos para - =: 'Reintentar' e 'int'

El siguiente parche - sucio * :) - habilita un rastreo de error sonoro:

# 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

La salida de sonido con el parche temporal es (¿se muestra dos veces ...?):

Reintentar (Reintentar (total = 1, conectar = Ninguno, leer = Ninguno, redireccionar = Ninguno)) después de que la conexión se interrumpa por 'ConnectTimeoutError (<peticiones.packages.urllib3.connection.VerifiedHTTPSConnection objeto en /

Reintentar (Reintentar (total = 0, conectar = Ninguno, leer = Ninguno, redireccionar = Ninguno)) después de que la conexión se interrumpa por 'ConnectTimeoutError (<solicitudes.packages.urllib3.connection.VerifiedHTTPSConnection objeto en /

No se pudo encontrar una versión que cumpla con el requisito evdev (de las versiones :)

No se encontró ninguna distribución coincidente para evdev

ADVERTENCIA: ¡Pip no pudo instalar el software!

Entonces, en mi caso, dos cosas causan el error, esto puede variar en otros entornos:

  1. Falta evdev => intenta instalar
  2. No se pudo conectar un repositorio / dist que contiene evdev para descargar. => finalmente ríndete

Mi entorno de instalación está fuera de línea desde un espejo interno de debian + raspbian, por lo que no quiero configurar el proxy ...

Entonces procedí con la instalación manual del componente faltante evdev :

  1. descargue evdev de PyPI (o, por ejemplo, de github.com):

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

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

  2. Desempaquete e instale manualmente como usuario root , para todas las cuentas locales, por lo que se detecta como instalado:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    instalación de python setup.py

  3. Vuelva a llamar al script de instalación:

    adafruit-pitft.sh # o pitft.sh

    ... Responder diálogos ...

    ...Eso es.

Si continúa en línea mediante acceso directo a PyPI :

  1. verifique su enrutamiento + firewall para acceder a pypi.org

  2. establecer un proxy si es necesario (http_proxy / https_proxy)

Y funciona..

Espero que esto también ayude en otros casos.

Arno-Can Uestuensoez

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

Ver también: problema - 35334: https://bugs.python.org/issue35334

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

Ver ahora también: problema - 1486: https://github.com/urllib3/urllib3/issues/1486

para el archivo: https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py


2

comprobar si hay problemas de red, para omitir el código de caso de excepción

En mi caso, estaba usando un índice personalizado, ese índice no tenía ruta y tal activaría el código de caso de excepción. El error del caso de excepción aún existe y aún enmascara el problema real; sin embargo, pude solucionarlo probando la conectividad con otras herramientas, como nc -vzw1 myindex.example.org 443y volviendo a intentarlo cuando la red estaba activa.


1

Me enfrentaba a un problema similar al intentar instalar la herramienta awscli en la instancia ec2. Cambié el grupo de seguridad para permitir el acceso de entrada y salida del puerto 443 y eso me resolvió el problema.


Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación , podrá comentar en cualquier publicación ; en su lugar, proporcione respuestas que no requieran aclaración por parte de quien pregunta . - De la crítica
Lukas Körfer

1
¿Se ve mejor ahora? Pensé que debería mencionar lo que encontré útil
Yogesh Gupta

1

Recibí este error cuando intentaba crear un virtualenvcomando with virtualenv myVirtualEnv. Acabo de agregar un sudoantes del comando; resolvió todo.


No es una solución: corro como root en Docker y tengo el mismo problema. Además, no explica por qué ayuda ejecutar como root.
Eric

1
@Eric, acabo de utilizar el enfoque de prueba y error; No conozco el propósito subyacente. A mí me funcionó, así que sugerí.
Zeinab Abbasimazar

1

Solución:
1. sudo apt remove python-pip
2. pip3 install pip(o instale pip por get-pip.py )

Por qué:
Este error ocurrió en pip 8.0.1 que instaló apt-get. Y sucedió solo cuando su red es inestable.

Si tiene un pip instalado con apt, este oculta el pip que instaló de otras formas, por lo que primero debe eliminar el apt.

Desconecté la red y probé 8.0.1, 9.0.3, 10.x las 3 versiones instaladas con pip3 o get-pip.py, no ocurrió ningún error. Entonces, creo que solo la versión apt de pip 8.0.1 tiene ese error, las otras están bien.


1

En mi caso, había abierto Pycharm en modo sudo y estaba ejecutando pip install nltk en la terminal de pycharm que mostraba este error. ejecutar con sudo pip install resuelve el error.


0

También tuve este problema. Inicialmente, se estableció un proxy y funciona bien. Luego me conecté a una red donde no pasa por un proxy. Después de desarmar el proxy pip nuevamente, funciona.

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY

0

Curiosamente, si elimino el proxy del entorno y lo agrego a la línea de comandos, me funciona. Por ejemplo, para actualizarse a pipsí mismo:

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

Mi problema fue tener el proxy en el entorno. Parece que pip solo honra al que está en discusión.


0

Esta es la solución de trabajo a este problema que encontré.

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

Para mí, resulta que wlan0 estaba inactivo, lo que provocó que no pudiera conectarme. Por lo tanto, asegurarse de que wlan0 estuviera activo, permitió que pip / pip3 funcionara sin problemas.


0

Probé la solución respondida arriba:

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

Cuando lo intenté

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

Recibí este mensaje

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

Hice lo siguiente y funciona

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.