Python PIP Install lança TypeError: tipo (s) de operando sem suporte para - =: 'Repetir' e 'int'

107

Usar pip installpara qualquer módulo aparentemente em meu sistema Ubuntu 16.04 com python 2.7.11+ gera este erro:

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

O que há de errado com o pip? Como posso reinstalá-lo, se necessário?

Atualização: Traceback completo está abaixo

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
fonte
@MartijnPieters Claro, anexando essa informação
devautor
Então, de onde vieram essas rodas? pipnormalmente usaria um requestspacote embutido e requestsnormalmente usaria um urllib3pacote embutido . Essas rodas não são versões embutidas e provavelmente são incompatíveis com a pipsubclasse de algum deste código. mover para o /usr/share/python-wheelslado talvez?
Martijn Pieters
Eu esperaria pipusar pip/_vendor/requests/e pip/_vendor/requests/packages/urllib3/, não /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
Eu não tenho a menor ideia sobre isso! Onde devo procurar informações sobre isso ou o que posso fazer?
devautor de
Desculpe, nenhuma resposta fácil aqui; apenas tentando diagnosticar seus problemas. O traceback é inesperado e aponta para um conflito entre as versões. É por isso que normalmente requestse pipincorporar suas dependências. Seu traceback mostra que nenhuma versão embutida está sendo usada, mas não sei por que isso acontece.
Martijn Pieters

Respostas:

87

O Ubuntu vem com uma versão do PIP do pré-cambrian e é assim que você deve atualizá-lo se não quiser gastar horas e horas depurando problemas relacionados ao 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 você observou, incluí informações para Python 2.xe 3.x

Sorin
fonte
2
Executar python get-pip.py falha com este "OSError: [Errno 13] Permissão negada: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'"
devautor
2
@mirror, use sudo porque get-pip.py tentará instalar o pip
Raghuram Vadapalli
45
Este problema não tem nada a ver com pip. o rastreamento de pilha mostra que a solicitação para obter o pacote falhou, indicando um problema de rede. Dizer ao OP para reinstalar o pip será apenas um desvio.
Thom
2
esta é a resposta certa, o culpado é o patch canônico pipque permanece sem correção por vários lançamentos agora: github.com/pypa/pip/issues/4779
lurscher
2
Usei em raspberian. Não foi possível executar "pip" mais. Só foi possível executar pip3. Tive que adicionar um link simbólico: ln -s / usr / local / bin / pip / usr / bin / pip retirado (e modificado) desta resposta: stackoverflow.com/questions/29712519/…
TheTrowser de
37

Se você estiver atrás de um proxy, deve executar algumas etapas de configuração extras antes de iniciar a instalação. Você deve definir a variável de ambiente http_proxy para o endereço do proxy. Usando o bash, isso é feito com o comando

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

Você também pode fornecer o

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

parâmetro para pip. A [user:pass@]porção é opcional.

Livruen Nati
fonte
25

Atualizar ferramentas de configuração funcionou bem para mim.

sudo pip install --upgrade setuptools
Matheswaran Kanagarajan
fonte
Funcionou para mim também. Na verdade, depois de fazer isso, percebi que os erros costumavam aparecer depois de: Coletando ferramentas de configuração (de kiwisolver> = 1.0.1-> matplotlib)
mayid
3
Isso funcionou para mim também em um Stretch Raspian. Aceite esta resposta para torná-la mais fácil de encontrar
Sam Hammamy
precisava reiniciar depois disso para assar trabalhar com framboesa
Pipo
4
Este comando causa o mesmo TypeError para mim no Debian9. Esta não é uma solução universal.
sir__finley
15

Em primeiro lugar, esse problema existe por causa de problemas de rede, e desinstalar e reinstalar tudo não será de muita ajuda. Provavelmente você está atrás de proxy e, nesse caso, precisa definir o proxy.

Mas, no meu caso, estava enfrentando o problema porque não estava atrás de proxy. Geralmente, trabalho por trás de proxy, mas quando trabalho em casa, defino o proxy como Nenhum nas configurações de rede.

Mas eu ainda estava recebendo os mesmos erros mesmo depois de remover as configurações de proxy.

Então, quando eu digitei

env | grep proxy

Eu encontrei algo assim:

http_proxy=http://127.0.0.1:1234/

E esse era o motivo pelo qual ainda recebia o mesmo erro, mesmo quando pensava que havia removido as configurações de proxy.

Para remover este proxy, digite

unset http_proxy

Siga a mesma abordagem para todas as outras entradas, como https_proxy.

Thisisashwani
fonte
14

O que acontece aqui é que as versões vendidas de request / urllib3 entram em conflito quando importadas em dois lugares diferentes (mesmo código, mas nomes diferentes). Se você tiver um erro de rede, ele não tentará obter o volante novamente, mas falhará com o erro acima. Veja aqui um mergulho mais profundo nesse erro.

Para a solução com sistema pip, veja acima .

Se você tiver esse problema em um virtualenv construído por python -m venv(que ainda copia as rodas /usr/share/python-wheels, mesmo se você tiver o pip instalado separadamente), a maneira mais fácil de "consertar" parece ser:

  1. crie o virtualenv: /usr/bin/python3.6 -m venv ...
  2. instalar requestsno ambiente (isso pode gerar o erro acima):<venv>/bin/pip install requests
  3. remova as versões copiadas requestsque seriam usadas pelo pip:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Agora, um <venv>/bin/pipusa a versão instalada do requestsurllib3.

Jan Katins
fonte
Obrigado, acabei de remover isso /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whle está corrigido agora (sem virtualenv).
Krsoni
Na verdade, no meu caso, não estava usando o env virtual.
Krsoni
Se você remover os arquivos whl diretamente no /usr/share/python-wheels, python -m venvnão criará mais um utilizável <venv>/bin/pip . Portanto, se você remover esses arquivos, certifique-se de não precisar deles. Se você precisar de um pip de sistema e de um pip venv, precisará instalar o sistema com um get-pip.py(consulte stackoverflow.com/a/37531821/1380673 ) e remover os arquivos whl em cada venv.
Jan Katins
7

a porta 443 não está aberta, apenas permita a porta 443 tcp personalizada se na AWS outra abrir a porta 443 para as conexões de saída ...

Deepak
fonte
Isso me ajudou muito no meu cluster OpenStack !! Boa, Deepak!
Arun Das
5

Apenas atualizar o pip funcionou para mim:

pip install --upgrade pip

cleicar
fonte
5
o erro aconteceu comigo ao executar este comando exato :(
allan.simon
Ele corrigiu o erro para mim em um Raspbian Sketch Lite.
Raúl Salinas-Monteagudo
1
Também estou executando o Raspian Stretch Lite e ele não corrigiu o erro.
Stefan Wegener
Eu concordo que funcionou perfeitamente "python -m pip install --upgrade pip"
imbatman
2

Tenho o mesmo problema ao instalar um RaspberryPI TFT da Adafruit com pitft.sh / adafruit-pitft.sh .

Não estou feliz com estilos de codificação com erros de algum lugar a serem interpretados de alguma forma - como pode ser visto pelas respostas anteriores.

Observação: A exceção de erro de tipo de retry.py é obviamente um bug, causado por uma atribuição e cálculo inadequados de uma instância da classe Responder a um int com o valor padrão de 10 - em algum lugar no código ... Deve ser corrigido também adicionando um operador local ou corrigindo a atribuição incorreta.

Então, tentei analisar e corrigir o próprio erro primeiro. O erro real no meu caso é o mesmo - retry.py chamado por pip .

O script de instalação adafruit-pitft.sh / pitft.sh tenta aplicar o urllib3 que por sua vez tenta instalar dependências aninhadas por pip , portanto, o mesmo erro.

adafruit-pitft.sh # ou pitft.sh

...

_stacktrace = sys.exc_info () [2]) Arquivo "/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / util / retry.py", linha 228, em incremento

total - = 1

TypeError: tipo (s) de operando não suportado (s) para - =: 'Repetir' e 'int'

Para a distribuição atual (com base em debian-9.6.0 / stretch):

Arquivo "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", linha 315, em incremento

total - = 1

TypeError: tipo (s) de operando não suportado (s) para - =: 'Repetir' e 'int'

O seguinte patch - sujo * :) - permite um rastreamento de erro 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

A saída de som com o patch temporário é (exibida duas vezes ...?):

Tentando novamente (Tentar novamente (total = 1, conectar = Nenhum, ler = Nenhum, redirecionar = Nenhum)) após a conexão interrompida por 'ConnectTimeoutError (<request.packages.urllib3.connection.VerifiedHTTPSConnection objeto em /

Tentando novamente (Tentar novamente (total = 0, conectar = Nenhum, ler = Nenhum, redirecionar = Nenhum)) após a conexão interrompida por 'ConnectTimeoutError (<request.packages.urllib3.connection.VerifiedHTTPSConnection objeto em /

Não foi possível encontrar uma versão que satisfaça o requisito evdev (das versões:)

Nenhuma distribuição correspondente encontrada para evdev

AVISO: Pip falhou ao instalar o software!

Portanto, no meu caso, na verdade, duas coisas causam o erro, isso pode variar em outros ambientes:

  1. Evdev ausente => tente instalar
  2. Falha ao conectar um repo / dist contendo evdev para fazer o download. => finalmente desista

Meu ambiente de instalação está offline de um espelho interno debian + raspbian, portanto, não quero definir o proxy ...

Então, continuei com a instalação manual do componente ausente evdev :

  1. baixe evdev de PyPI (ou, por exemplo, de github.com):

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

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

  2. Descompacte e instale manualmente como usuário root - para todas as contas locais, assim detectadas como instaladas:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    python setup.py install

  3. Chame o script de instalação novamente:

    adafruit-pitft.sh # ou pitft.sh

    ... Responder diálogos ...

    ...é isso aí.

Se você continuar online por acesso PyPI direto :

  1. verifique seu roteamento + firewall para acessar pypi.org

  2. defina um proxy se necessário (http_proxy / https_proxy)

E funciona ..

Espero que isso ajude em outros casos também.

Arno-Can Uestuensoez

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

Consulte também: problema - 35334: https://bugs.python.org/issue35334

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

Veja agora também: problema - 1486: https://github.com/urllib3/urllib3/issues/1486

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

um palpite
fonte
2

verifique se há problemas de rede para ignorar o código de caso de exceção

No meu caso, eu estava usando um índice personalizado, esse índice não tinha rota e isso acionaria o código do caso de exceção. O bug do caso de exceção ainda existe e mascara o problema real, no entanto, consegui contornar isso testando a conectividade com outras ferramentas, como nc -vzw1 myindex.example.org 443e tentando novamente quando a rede estava ativa.

ThorSummoner
fonte
1

Eu estava enfrentando um problema semelhante ao tentar instalar a ferramenta awscli na instância ec2. Mudei o grupo de segurança para permitir o acesso de entrada e saída da porta 443 e isso resolveu o problema para mim.

Yogesh Gupta
fonte
Isso não fornece uma resposta para a pergunta. Assim que tiver reputação suficiente, você poderá comentar sobre qualquer postagem ; em vez disso, forneça respostas que não exijam esclarecimentos do autor da pergunta . - Da avaliação
Lukas Körfer
1
Parece melhor agora? Eu apenas pensei que deveria mencionar o que achei útil
Yogesh Gupta
1

Recebi este erro quando estava tentando criar um virtualenvcomando with virtualenv myVirtualEnv. Acabei de adicionar um sudoantes do comando; resolveu tudo.

Zeinab Abbasimazar
fonte
Não é uma solução: executo como root no docker e tenho o mesmo problema. Além disso, você não explica por que rodar como root ajuda.
Eric,
1
@Eric, acabei de usar a abordagem try & error; Não sei o propósito subjacente. Funcionou para mim, então sugeri.
Zeinab Abbasimazar
1

Solução:
1. sudo apt remove python-pip
2. pip3 install pip(ou instale o pip por get-pip.py )

Por que:
Este erro ocorreu no pip 8.0.1 que foi instalado pelo apt-get. E aconteceu apenas quando sua rede está instável.

Se você tem um pip instalado com o apt, ele esconde o pip que você instalou de outras maneiras, então você deve remover o apt primeiro.

Eu desconectei a rede e testei 8.0.1, 9.0.3, 10.x as 3 versões instaladas com pip3 ou get-pip.py, nenhum erro ocorreu. Então, eu acho que apenas a versão apt do pip 8.0.1 tem esse bug, as outras estão ok.

Haocheng Yang
fonte
1

No meu caso, abri o Pycharm no modo sudo e estava executando o pip install nltk no terminal do pycharm, que exibia esse erro. executar com sudo pip install resolve o erro.

Aayush Arora
fonte
0

Eu também tive esse problema. Inicialmente, um proxy foi configurado e funcionou bem. Aí me conectei a uma rede onde não passa por proxy. Depois de desarmar o proxy pip novamente, funcionará.

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

Estranhamente, se eu remover o proxy do ambiente e adicioná-lo à linha de comando, ele funcionará para mim. Por exemplo, para se atualizar pip:

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

Meu problema era ter proxy no ambiente. Parece que pip só honra aquele que está em discussão.

Eric
fonte
0

Esta é a solução de trabalho para este problema que encontrei.

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
fonte
0

Para mim, descobri que wlan0 estava desativado, o que resultou na impossibilidade de me conectar. Então, garantindo que wlan0 estava ativo, o pip / pip3 funcionou sem problemas.

japharl
fonte
0

Tentei a solução respondida acima:

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

Quando eu tentei

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

Eu recebi essa mensagem

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

Eu fiz o seguinte e 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
i_thamary
fonte