L'installation Python PIP lève TypeError: type (s) d'opérande non pris en charge pour - =: 'Retry' et 'int'

107

L'utilisation pip installde n'importe quel module apparemment sur mon système Ubuntu 16.04 avec python 2.7.11+ génère cette erreur:

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

Quel est le problème avec pip? Comment pourrais-je le réinstaller, si nécessaire?

Mise à jour: le suivi complet est ci-dessous

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'
devauteur
la source
@MartijnPieters Bien sûr, en ajoutant cette information
devautor
Alors d'où viennent ces roues? piputiliserait normalement un requestspackage intégré et requestsutiliserait normalement un urllib3package intégré . Ces roues ne sont pas des versions intégrées et sont probablement incompatibles avec la pipsous - classe de certains de ce code. s'écarter /usr/share/python-wheelspeut-être?
Martijn Pieters
Je m'attendrais pipà utiliser pip/_vendor/requests/et pip/_vendor/requests/packages/urllib3/, pas /usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requestsou /usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3.
Martijn Pieters
Je n'ai aucune idée à ce sujet! Où dois-je chercher des informations à ce sujet ou que puis-je faire?
devautor
Désolé, pas de réponse facile ici; essayez simplement de diagnostiquer vos problèmes. Le traçage est inattendu et indique un conflit entre les versions. C'est pourquoi normalement requestset pipincorporer leurs dépendances. Votre traceback montre qu'aucune version intégrée n'est utilisée, mais je ne sais pas pourquoi .
Martijn Pieters

Réponses:

87

Ubuntu est livré avec une version de PIP du précambrien et c'est ainsi que vous devez la mettre à niveau si vous ne voulez pas passer des heures et des heures à déboguer les problèmes liés à pip.

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

Comme vous l'avez observé, j'ai inclus des informations pour Python 2.x et 3.x

Sorin
la source
2
Faire python get-pip.py échoue avec cette "OSError: [Errno 13] Autorisation refusée: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'"
devautor
2
@mirror, utilisez sudo car get-pip.py essaiera d'installer pip
Raghuram Vadapalli
45
Ce problème n'a rien à voir avec pip. la trace de pile indique que la demande d'obtention du package échoue, indiquant un problème de réseau. Dire à l'OP de réinstaller pip ne sera qu'un détour.
Thom
2
c'est la bonne réponse, le coupable est le correctif canonique pipqui n'a pas été corrigé depuis plusieurs versions maintenant: github.com/pypa/pip/issues/4779
lurscher
2
Utilisé sur la framboise. Impossible d'exécuter "pip" plus. Ne pouvait exécuter que pip3. J'ai dû ajouter un lien symbolique: ln -s / usr / local / bin / pip / usr / bin / pip pris (et modifié) de cette réponse: stackoverflow.com/questions/29712519/…
TheTrowser
37

Si vous êtes derrière un proxy, vous devez effectuer quelques étapes de configuration supplémentaires avant de démarrer l'installation. Vous devez définir la variable d'environnement http_proxy sur l'adresse proxy. En utilisant bash, cela est accompli avec la commande

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

Vous pouvez également fournir le

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

paramètre à pip. La [user:pass@]portion est facultative.

Livruen Nati
la source
25

La mise à jour de setuptools a bien fonctionné pour moi.

sudo pip install --upgrade setuptools
Matheswaran Kanagarajan
la source
A travaillé pour moi aussi. En fait, après avoir fait cela, j'ai réalisé que les erreurs apparaissaient après: Collecte de setuptools (de kiwisolver> = 1.0.1-> matplotlib)
mayid
3
Cela a fonctionné pour moi aussi sur un Raspian Stretch. Veuillez accepter cette réponse pour faciliter la recherche
Sam Hammamy
besoin d'un redémarrage après cela pour le faire fonctionner avec raspbian
Pipo
4
Cette commande me cause la même erreur de type sur Debian9. Ce n’est pas une solution universelle.
sir__finley le
15

Tout d'abord, ce problème existe en raison de problèmes de réseau et la désinstallation et la réinstallation de tout ne seront pas d'une grande aide. Vous êtes probablement derrière le proxy, et dans ce cas, vous devez définir un proxy.

Mais dans mon cas, j'étais confronté au problème car je n'étais pas derrière proxy. En général, je travaille derrière un proxy, mais lorsque je travaille à domicile, je règle le proxy sur Aucun dans les paramètres réseau.

Mais j'obtenais toujours les mêmes erreurs même après avoir supprimé les paramètres de proxy.

Alors, quand j'ai tapé

env | grep proxy

J'ai trouvé quelque chose comme ça:

http_proxy=http://127.0.0.1:1234/

Et c'était la raison pour laquelle j'obtenais toujours la même erreur, même lorsque je pensais avoir supprimé les paramètres du proxy.

Pour désactiver ce proxy, saisissez

unset http_proxy

Suivez la même approche pour toutes les autres entrées, telles que https_proxy.

thisisashwani
la source
14

Ce qui se passe ici, c'est que les versions vendues de request / urllib3 s'affrontent lorsqu'elles sont importées à deux endroits différents (même code, mais noms différents). Si vous rencontrez ensuite une erreur réseau, il ne réessaye pas d'obtenir la roue, mais échoue avec l'erreur ci-dessus. Voir ici pour une analyse plus approfondie de cette erreur.

Pour la solution avec système pip, voir ci - dessus .

Si vous rencontrez ce problème dans un virtualenv construit par python -m venv(qui copie toujours les roues /usr/share/python-wheels, même si vous avez installé pip séparément), le moyen le plus simple de le «réparer» semble être:

  1. créez le virtualenv: /usr/bin/python3.6 -m venv ...
  2. installer requestsdans l'environnement (cela peut provoquer l'erreur ci-dessus):<venv>/bin/pip install requests
  3. supprimez les versions copiées requestsqui seraient utilisées par pip:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Maintenant, a <venv>/bin/piputilise la version installée de requestslaquelle urllib3 est vendue.

Jan Katins
la source
Merci, je viens de supprimer cela /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whlet c'est corrigé maintenant (sans virtualenv).
krsoni
En fait, dans mon cas, je n'utilisais pas l'environnement virtuel.
krsoni
Si vous supprimez les fichiers whl directement dans /usr/share/python-wheels, python -m venvne créera <venv>/bin/pip plus de fichier utilisable . Donc, si vous supprimez ces fichiers, vous devez être sûr que vous n'en avez pas besoin. Si vous avez besoin à la fois d'un pip système et d'un pip venv, vous devez installer le système avec get-pip.py(voir stackoverflow.com/a/37531821/1380673 ) et vous devez supprimer les fichiers whl dans chaque venv.
Jan Katins
7

le port 443 n'est pas ouvert, autorisez simplement le port tcp personnalisé 443 si sur AWS sinon ouvrez le port 443 pour les connexions sortantes ...

Deepak
la source
Cela m'a beaucoup aidé dans mon cluster OpenStack !! Bon un Deepak!
Arun Das
5

Juste mettre à jour pip a fonctionné pour moi:

pip install --upgrade pip

Cléicar
la source
5
l'erreur m'est
arrivée
Cela a corrigé l'erreur pour moi sur un Raspbian Sketch Lite.
Raúl Salinas-Monteagudo
1
J'utilise également Raspian Stretch Lite et cela n'a pas corrigé l'erreur.
Stefan Wegener
Je suis d'accord que cela a fonctionné à merveille "python -m pip install --upgrade pip"
imbatman
2

J'ai le même problème lors de l'installation d'un RaspberryPI TFT d'Adafruit avec pitft.sh / adafruit-pitft.sh .

Je ne suis pas content des styles de codage avec des erreurs de quelque part à interpréter d'une manière ou d'une autre - comme l'ont montré les réponses précédentes.

Remarque: L'exception d'erreur de type de retry.py est évidemment un bogue, causé par une affectation et un calcul inappropriés d'une instance de la classe Répondre à un int avec la valeur par défaut de 10 - quelque part dans le code ... Doit être corrigé soit en ajoutant un opérateur inplace, ou en corrigeant l'affectation erronée.

J'ai donc essayé d'analyser et de corriger l'erreur elle-même en premier. L'erreur réelle dans mon cas est la même - retry.py appelée par pip .

Le script d'installation adafruit-pitft.sh / pitft.sh essaie d'appliquer urllib3 qui tente lui-même d'installer les dépendances imbriquées par pip , donc la même erreur.

adafruit-pitft.sh # ou pitft.sh

...

_stacktrace = sys.exc_info () [2]) Fichier "/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / util / retry.py", ligne 228, dans incrément

total - = 1

TypeError: type (s) d'opérande non pris en charge pour - =: 'Retry' et 'int'

Pour la distribution actuelle (basée sur debian-9.6.0 / stretch):

Fichier "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", ligne 315, par incrément

total - = 1

TypeError: type (s) d'opérande non pris en charge pour - =: 'Retry' et 'int'

Le patch suivant - dirty * :) - active une trace d'erreur sonore:

# 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 sortie sonore avec le patch temporaire est (affichée deux fois ...?):

Nouvelle tentative (Retry (total = 1, connect = None, read = None, redirect = None)) après la connexion interrompue par l'objet 'ConnectTimeoutError (<requests.packages.urllib3.connection.VerifiedHTTPSConnection à /

Nouvelle tentative (Retry (total = 0, connect = None, read = None, redirect = None)) après une connexion interrompue par l'objet 'ConnectTimeoutError (<requests.packages.urllib3.connection.VerifiedHTTPSConnection à /

Impossible de trouver une version qui satisfait à l'exigence evdev (à partir des versions:)

Aucune distribution correspondante trouvée pour evdev

AVERTISSEMENT: Pip n'a pas réussi à installer le logiciel!

Donc, dans mon cas, deux choses provoquent l'erreur, cela peut varier dans d'autres environnements:

  1. Evdev manquant => essayez d'installer
  2. Échec de la connexion d'un repo / dist contenant evdev pour le téléchargement. => abandonner enfin

Mon environnement d'installation est hors ligne à partir d'un miroir interne Debian + raspbian, donc je ne veux pas définir le proxy ...

J'ai donc procédé à l'installation manuelle du composant manquant evdev :

  1. téléchargez evdev depuis PyPI (ou par exemple depuis github.com):

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

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

  2. Décompressez et installez manuellement en tant qu'utilisateur root - pour tous les comptes locaux, ainsi détectés comme installés:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    installation de python setup.py

  3. Appelez à nouveau le script d'installation:

    adafruit-pitft.sh # ou pitft.sh

    ... Répondre aux dialogues ...

    ...c'est tout.

Si vous procédez en ligne par accès direct PyPI :

  1. vérifiez votre routage + pare-feu pour accéder à pypi.org

  2. définir un proxy si nécessaire (http_proxy / https_proxy)

Et il fonctionne..

J'espère que cela aidera également dans d'autres cas.

Arno-Can Uestuensoez

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

Voir aussi: issue - 35334: https://bugs.python.org/issue35334

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

Voir aussi maintenant: issue - 1486: https://github.com/urllib3/urllib3/issues/1486

pour le fichier: https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py

acue
la source
2

vérifier les problèmes de réseau, pour contourner le code de cas d'exception

Dans mon cas, j'utilisais un index personnalisé, cet index n'avait pas de route et cela déclencherait le code de cas d'exception. Le bogue de cas d'exception existe toujours et masque toujours le vrai problème, mais j'ai pu contourner ce problème en testant la connectivité avec d'autres outils tels que nc -vzw1 myindex.example.org 443et en réessayant lorsque le réseau était en place.

ThorSummoner
la source
1

J'étais confronté à un problème similaire en essayant d'installer l'outil awscli sur l'instance ec2. J'ai changé de groupe de sécurité pour autoriser l'accès au port 443 entrant et sortant et cela a résolu le problème pour moi.

Yogesh Gupta
la source
Cela ne répond pas à la question. Une fois que vous aurez une réputation suffisante, vous pourrez commenter n'importe quel message ; au lieu de cela, fournissez des réponses qui ne nécessitent pas de clarification de la part du demandeur . - De l'avis
Lukas Körfer
1
Est-ce que ça a l'air mieux maintenant? Je pensais juste que je devrais mentionner ce que j'ai trouvé utile
Yogesh Gupta
1

J'ai eu cette erreur lorsque j'essayais de créer une virtualenvcommande with virtualenv myVirtualEnv. Je viens d'ajouter un sudoavant la commande; il a tout résolu.

Zeinab Abbasimazar
la source
Ce n'est pas une solution: je lance en tant que root dans docker et j'ai le même problème. De plus, vous n'expliquez pas pourquoi courir en tant que root aide.
Eric
1
@Eric, je viens d'utiliser l'approche try & error; Je ne connais pas le but sous-jacent. Cela a fonctionné pour moi, alors j'ai suggéré.
Zeinab Abbasimazar
1

Solution:
1. sudo apt remove python-pip
2. pip3 install pip(ou installez pip par get-pip.py )

Pourquoi:
Cette erreur s'est produite sur pip 8.0.1 installé par apt-get. Et cela ne s'est produit que lorsque votre réseau est instable.

Si vous avez un pip installé avec apt, il cache le pip que vous avez installé par d'autres moyens, vous devez donc d'abord supprimer l'apt.

J'ai déconnecté le réseau et testé 8.0.1, 9.0.3, 10.x les 3 versions installées avec pip3 ou get-pip.py, aucune erreur ne s'est produite. Donc, je pense que seule la version apt de pip 8.0.1 a ce bogue, les autres sont ok.

Haocheng Yang
la source
1

Dans mon cas, j'avais ouvert Pycharm en mode sudo et exécutais pip install nltk dans le terminal pycharm, ce qui montrait cette erreur. l'exécution avec sudo pip install résout l'erreur.

Aayush Arora
la source
0

J'ai aussi eu ce problème. Au départ, un proxy a été défini et fonctionne correctement. Ensuite, je me suis connecté à un réseau où il ne passe pas par un proxy. Après avoir désinstallé le proxy pip, recommencez.

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY
GPrathap
la source
0

Bizarrement, si je supprime le proxy de l'environnement et l'ajoute à la ligne de commande, cela fonctionne pour moi. Par exemple pour se mettre à niveau pip:

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

Mon problème était d'avoir le proxy dans l'environnement. Il semble que pip n'honore que celui en discussion.

Eric
la source
0

C'est la solution de travail à ce problème que j'ai trouvé.

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
la source
0

Pour moi, il s'avère que wlan0 était en panne, ce qui m'a empêché de me connecter. Donc, en s'assurant que wlan0 était actif, a permis à pip / pip3 de fonctionner sans problème.

japharl
la source
0

J'ai essayé la solution répondue ci-dessus:

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

Quand j'ai essayé

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

J'ai ce message

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

J'ai fait ce qui suit et ça marche

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
la source