Python PIP安装抛出TypeError:不支持的操作数类型 - =:'Retry'和'int'

问题描述 投票:83回答:19

使用pip install显然在我的Ubuntu 16.04系统上使用python 2.7.11+的任何模块都会抛出此错误:

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

pip有什么问题?如有必要,我该如何重新安装?

更新:完整回溯如下

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'
python pip
19个回答
79
投票

Ubuntu附带了一个来自前寒武纪的PIP版本,如果您不想花费数小时和数小时来调试与pip相关的问题,那么就必须升级它。

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

正如您所观察到的,我包含了Python 2.x和3.x的信息


2
投票

使用pitft.sh / adafruit-pitft.sh从Adafruit安装RaspberryPI TFT时遇到同样的问题。

我不满意编码样式,错误来自某处以某种方式被解释 - 正如之前的答案所见。

备注:retry.py的类型错误异常显然是一个错误,由一个不合适的分配和类的实例的计算引起的回复一个int的默认值为10 - 在代码的某个地方......应该修复通过添加一个inplace-operator,或修复错误的赋值。

因此,首先尝试分析并修补错误本身。我案例中的实际错误是相同的 - 由pip调用的retry.py。

安装脚本adafruit-pitft.sh / pitft.sh尝试应用urllib3,它本身试图通过pip安装嵌套依赖项,所以同样的错误。

adafruit-pitft.sh#或pitft.sh

...

_stacktrace = sys.exc_info()[2])文件“/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / util / retry.py”,第228行,in增量

总计 - = 1

TypeError:不支持的操作数类型 - =:'重试'和'int'

对于当前分布(基于debian-9.6.0 / stretch):

文件“/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py”,第315行,增量

总计 - = 1

TypeError:不支持的操作数类型 - =:'重试'和'int'

以下 - dirty * :) - patch启用探测错误跟踪:

# 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

临时补丁的声音输出是(显示两次......?):

重试(重试(total = 1,connect = None,read = None,redirect = None))连接被'ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection对象/

重试(重试(total = 0,connect = None,read = None,redirect = None))连接被'ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection对象)处断后

找不到满足要求evdev的版本(来自版本:)

找不到evdev的匹配分布

警告:Pip无法安装软件!

所以在我的情况下实际上有两件事会导致错误,这在其他环境中会有所不同:

  1. 缺少evdev =>尝试安装
  2. 无法连接包含evdev的repo / dist以便下载。 =>终于放弃了

我的安装环境是从内部debian + raspbian镜像离线,因此不想设置代理...

所以我继续手动安装缺少的组件evdev:

  1. 从PyPI下载evdev(或者从github.com下载): https://pypi.org/project/evdev/ https://files.pythonhosted.org/packages/7e/53/374b82dd2ccec240b7388c65075391147524255466651a14340615aabb5f/evdev-1.1.2.tar.gz
  2. 以root用户身份手动解压缩和安装 - 适用于所有本地帐户,因此检测为已安装: sudo su - tar xf evdev-1.1.2.tar.gz cd evdev-1.1.2 python setup.py安装
  3. 再次调用安装脚本: adafruit-pitft.sh#或pitft.sh ...回答对话...... ...而已。

如果您通过直接PyPI访问在线继续:

  1. 检查您的路由+防火墙以访问pypi.org
  2. 如果需要,设置代理(http_proxy / https_proxy)

它的工作原理..

希望这在其他情况下也有帮助。

Arno-Can Uestuensoez

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

另见:issue - 35334:https://bugs.python.org/issue35334

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

现在也见:issue - 1486:https://github.com/urllib3/urllib3/issues/1486

对于文件:https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py


1
投票

尝试在ec2实例上安装awscli工具时,我遇到了类似的问题。我更改了安全组以允许端口443入站和出站访问,这解决了我的问题。


1
投票

当我尝试使用命令virtualenv创建virtualenv myVirtualEnv时,我收到此错误。我刚刚在命令之前加了一个sudo;它解决了一切。


1
投票

我尝试了上面解决的解决方案:

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

当我尝试

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

我收到了这条消息

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

我做了以下工作

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

0
投票

我也有这个问题。最初,代理设置并正常工作。然后我连接到一个不通过代理的网络。在取消设置代理点后再次获得工作。

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY

0
投票

奇怪的是,如果我从环境中删除代理并将其添加到命令行,它对我有用。例如,升级pip本身:

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

我的问题是在环境中使用代理。似乎pip只尊重争论中的那一个。


0
投票

这是我找到的这个问题的有效解决方案。

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
投票

解: 1. sudo apt remove python-pip 2. pip3 install pip(或由get-pip.py安装pip)

为什么: 在由apt-get安装的pip 8.0.1上发生此错误。并且仅在您的网络不稳定时发生。

如果你用apt安装了一个pip,它会隐藏你通过其他方式安装的pip,所以你应该先删除apt。

我断开了网络并测试了使用pip3或get-pip.py安装的3个版本的8.0.1,9.0.3,10.x,没有发生错误。所以,我认为只有pip 8.0.1的apt版本有这个bug,其他的都没问题。


0
投票

对于我自己来说,事实证明wlan0已经关闭,导致我无法连接。因此,确保wlan0启动,允许pip / pip3正常工作。


0
投票

在我的情况下,我在sudo模式下打开了Pycharm,并在pycharm终端中运行pip install nltk,显示此错误。使用sudo pip install运行解决了这个错误。


31
投票

如果您位于代理之后,则必须在开始安装之前执行一些额外的配置步骤。您必须将环境变量http_proxy设置为代理地址。使用bash,这是通过命令完成的

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

你也可以提供

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

pip的参数。 [user:pass@]部分是可选的。


13
投票

首先,由于网络问题,存在此问题,卸载和重新安装一切都不会有太大帮助。可能你落后于代理,在这种情况下你需要设置代理。

但就我而言,我遇到了问题,因为我并没有落后于代理。通常,我在代理后面工作,但在家工作时,我在网络设置中将代理设置为无。

但是,即使删除了代理设置,我仍然会遇到相同的错误。

所以,当我打字的时候

env | grep proxy

我找到了这样的东西:

http_proxy=http://127.0.0.1:1234/

这就是我仍然得到同样错误的原因,即使我认为我已经删除了代理设置。

要取消设置此代理,请键入

unset http_proxy

对所有其他条目采用相同的方法,例如https_proxy。


11
投票

这里发生的是在两个不同的地方(相同的代码,但名称不同)导入时,request / urllib3的销售版本会发生冲突。如果您有网络错误,它不会重试获取方向盘,但会因上述错误而失败。请参阅here以深入了解此错误。

有关系统点的解决方案,请参阅above

如果你在由python -m venv构建的virtualenv中存在这个问题(它仍然从/usr/share/python-wheels复制轮子,即使你单独安装了pip),最简单的方法是“修复”它似乎是:

  1. 创造virtualenv:/usr/bin/python3.6 -m venv ...
  2. requests安装到环境中(这可能会引发上述错误):<venv>/bin/pip install requests
  3. 删除pip:requests将使用的rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl的复制版本

现在<venv>/bin/pip使用安装了版本的requests,其中已经有urllib3。


9
投票

更新setuptools对我来说很好。

sudo pip install --upgrade setuptools

6
投票

端口443未打开,只允许自定义tcp端口443,如果在AWS上打开端口443用于出站连接...


5
投票

只是升级pip为我工作:

pip install --upgrade pip


3
投票

我使用pip为任何软件包安装收到此错误。后来我发现pip需要http_proxyhttps_proxy变量才能在代理后面运行。设置这两个环境变量后,此问题已得到修复。

export http_proxy=http://<username>:<passowrd>@<proxy_ip>:<proxy_port>/
export https_proxy=https://<username>:<passowrd>@<proxy_ip>:<proxy_port>/

3
投票

当我在代理后面工作时,这种情况发生在我身上。我只是简单地解决了这个问题

pip install --proxy http://proxyAddress:Port Package_To_Be_Installed

© www.soinside.com 2019 - 2024. All rights reserved.