Python PIP安装会引发TypeError:-=:'Retry'和'int'不受支持的操作数类型


106

使用pip install了显然与蟒蛇2.7.11+我的Ubuntu 16.04系统中的任何模块抛出这个错误:

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

点子有什么问题?如有必要,如何重新安装?

更新:下面是完整的追溯

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当然可以,附加该信息
devautor

那么这些轮子是从哪里来的呢?pip通常将使用嵌入式requests程序包,并且requests通常将使用嵌入式urllib3程序包。这些轮子不是嵌入式版本,可能与pip某些代码的子类不兼容。移动/usr/share/python-wheels一边吧?
马丁·皮特斯

我希望pip使用pip/_vendor/requests/pip/_vendor/requests/packages/urllib3/,而不是/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3
马丁·彼得斯

我对此一无所知!我应该在哪里寻找有关此信息,或者该怎么办?
devautor's

抱歉,这里没有简单的答案;只是试图诊断您的问题。追溯是意外的,并且指向版本之间的冲突。这就是为什么通常情况下requestspip嵌入它们的依赖关系。您的追溯显示未使用任何嵌入式版本,但是我不知道为什么这样做。
马丁·彼得斯

Answers:


86

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
做python get-pip.py失败,出现以下错误:“ OSError:[Errno 13]权限被拒绝:'/
usr

2
@mirror,请使用sudo,因为get-pip.py将尝试安装pip
Raghuram Vadapalli

45
这个问题与点子无关。堆栈跟踪显示获取软件包的请求失败,表明存在网络问题。告诉OP重新安装pip只是绕路而已。
汤姆(Thom)

2
这是正确的答案,罪魁祸首是pip目前尚无法解决
lurscher

2
用在树莓上。无法再运行“点子”。只能运行pip3。我必须添加一个符号链接:ln -s / usr / local / bin / pip / usr / bin / pip从此答案中获取(并修改):stackoverflow.com/questions/29712519/…–
TheTrowser

36

如果您使用代理,则必须先执行一些额外的配置步骤,然后再开始安装。您必须将环境变量http_proxy设置为代理地址。使用bash可以通过以下命令完成

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

您还可以提供

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

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


24

更新setuptools对我来说效果很好。

sudo pip install --upgrade setuptools

也为我工作。实际上,执行完此操作后,我意识到以下错误经常出现:收集setuptools(来自kiwisolver> = 1.0.1-> matplotlib)
mayid

3
这在Raspian Stretch上对我也起作用。请接受这个答案,使之更容易找到
萨姆Hammamy

之后需要重启才能使它与raspbian一起工​​作
Pipo

4
此命令在Debian9上对我造成相同的TypeError。这不是通用解决方案。
sir__finley

15

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

但就我而言,我面临的问题是因为我没有落后于代理人。通常,我在代理后面工作,但是在家工作时,我在“网络”设置中将代理设置为“无”。

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

所以,当我输入

env | grep proxy

我发现了这样的事情:

http_proxy=http://127.0.0.1:1234/

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

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

unset http_proxy

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


14

这里发生的是,在两个不同的位置(相同的代码,但名称不同)导入时,request / urllib3的供应商版本发生冲突。如果随后出现网络错误,它不会重试,但是会因上述错误而失败。请参阅此处,深入了解此错误。

有关使用系统点的解决方案,请参见上文

如果您在由谁构建的virtualenv中有此问题python -m venv/usr/share/python-wheels即使您单独安装了pip,它仍然会从复制车轮),“修复”的最简单方法似乎是:

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

现在,a <venv>/bin/pip使用requests已提供urllib3的已安装版本。


谢谢,我刚刚删除了它/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl,现在已修复(没有virtualenv)。
krsoni

实际上,就我而言,我没有使用虚拟环境。
krsoni

如果直接在中删除whl文件/usr/share/python-wheelspython -m venv将不再创建可用文件<venv>/bin/pip 。因此,如果删除这些文件,则应确保不需要它。如果确实需要系统pip和venv pip,则需要使用来安装系统pip get-pip.py(请参见stackoverflow.com/a/37531821/1380673),并且需要删除每个venv中的whl文件。
Jan Katins

7

端口443未打开,如果在AWS上,则允许自定义tcp端口443,否则打开出站连接的端口443 ...


这帮助我在OpenStack集群中度过了愉快的时光!迪帕克好人!
阿伦·戴斯


2

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

我不满意编码样式的错误,该错误来自某个地方,可以以某种方式解释-如前面的答案所示。

备注:的类型错误异常retry.py显然是一个错误,所造成的类的实例的unappropriate assignement和计算回复INT与默认值10 -在代码的某个地方......应该是固定的通过添加就地运算符或修正错误的分配。

因此,尝试首先分析和修补错误本身。在我的案例中,实际的错误是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行,增量

总计-= 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”的不受支持的操作数类型

以下-脏* :)-修补程序启用探测错误跟踪:

# 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

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

连接被'ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at /

连接被'ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at /

找不到满足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用户身份解压缩并手动安装-对于所有本地帐户,因此被检测为已安装:

    苏多苏-

    tar xf evdev-1.1.2.tar.gz

    光盘evdev-1.1.2

    python setup.py安装

  3. 再次调用安装脚本:

    adafruit-pitft.sh#或pitft.sh

    回答对话

    ...而已。

如果您通过直接PyPI访问进行在线操作:

  1. 检查您的路由和防火墙以访问pypi.org

  2. 根据需要设置代理(http_proxy / https_proxy)

而且有效。

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

阿尔诺·坎·乌斯图恩斯

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

另请参阅:问题-35334:https://bugs.python.org/issue35334

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

现在另请参阅:问题-1486:https : //github.com/urllib3/urllib3/issues/1486

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


2

检查网络问题,绕过异常案例代码

就我而言,我使用的是自定义索引,该索引没有路由,因此会触发异常案例代码。异常情况错误仍然存​​在,并且仍然掩盖了实际问题,但是我能够通过测试与其他工具的连接性来解决此问题,例如nc -vzw1 myindex.example.org 443在网络启动时重试。


1

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


这不能为问题提供答案。一旦您拥有足够的声誉,您就可以在任何帖子中发表评论;相反,请提供不需要问询者澄清的答案。- 来自评论
LukasKörfer'17

1
现在看起来好点了吗?我只是认为我应该提到我认为有帮助的地方
Yogesh Gupta

1

尝试创建virtualenvwith命令时收到此错误virtualenv myVirtualEnv。我只是sudo在命令前添加了一个;它解决了一切。


这不是解决方案:我在docker中以root身份运行,并遇到相同的问题。另外,您也没有解释为什么以root身份运行会有所帮助。
艾瑞克(Eric)

1
@Eric,我只是用了try&error方法;我不知道潜在的目的。它对我有用,所以我建议。
Zeinab Abbasimazar

1

解决方案:
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,没有发生错误。因此,我认为只有apt版本的pip 8.0.1才有该错误,其他都可以。


1

就我而言,我以sudo模式打开了Pycharm,并在pycharm终端中运行了pip install nltk,该错误显示了此错误。使用sudo pip install运行可解决该错误。


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'

我的问题是在环境中使用代理。看来,点子只是在争论中尊重那个人。


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

对我自己来说,原来wlan0掉了下来,这导致我无法连接。因此,确保wlan0启动,允许pip / pip3正常工作。


0

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.