首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >isinstance()意外返回False

isinstance()意外返回False
EN

Stack Overflow用户
提问于 2017-10-12 17:28:39
回答 1查看 921关注 0票数 9

我正在使用kubernetes python客户端。如果当我的代码启动时kubernetes不可用,我想重试连接。

当客户端无法连接时,它会抛出似乎是urllib3.exceptions.MaxRetryError异常,因此我从如下内容开始:

代码语言:javascript
复制
import time
import urllib3

import kubernetes

kubernetes.config.load_kube_config()
api = kubernetes.client.CoreV1Api()

while True:
    try:
        w = kubernetes.watch.Watch()
        for event in w.stream(api.list_pod_for_all_namespaces):
            print event
    except urllib3.exceptions.HTTPError:
        print('retrying in 1 second')
        time.sleep(1)

但是,这完全失败了;它的表现就像没有except语句一样,并且使用:

代码语言:javascript
复制
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='192.168.122.140', port=8443): Max retries exceeded with url: /api/v1/pods?watch=True (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x2743110>: Failed to establish a new connection: [Errno 111] Connection refused',))

我想,也许我不像我想的那样理解继承,所以我用以下内容代替了上面的内容:

代码语言:javascript
复制
except urllib3.exceptions.MaxRetryError:
    print('retrying in 1 second')
    time.sleep(1)

以同样的方式失败。为了弄清到底发生了什么,我添加了一个catch except并调用了pdb:

代码语言:javascript
复制
except Exception as err:
    import pdb; pdb.set_trace()

pdb提示符中,我们可以看到:

代码语言:javascript
复制
(Pdb) type(err)
<class 'urllib3.exceptions.MaxRetryError'>

...which看起来很好,mro也是这样:

代码语言:javascript
复制
(Pdb) import inspect
(Pdb) inspect.getmro(err.__class__)
(<class 'urllib3.exceptions.MaxRetryError'>, <class 'urllib3.exceptions.RequestError'>, <class 'urllib3.exceptions.PoolError'>, <class 'urllib3.exceptions.HTTPError'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)

但尽管如此:

代码语言:javascript
复制
(Pdb) isinstance(err, urllib3.exceptions.MaxRetryError)
False

所有的道路看起来都是合理的:

代码语言:javascript
复制
(Pdb) urllib3.__file__
'/usr/lib/python2.7/site-packages/urllib3/__init__.pyc'
(Pdb) kubernetes.client.rest.urllib3.__file__
'/usr/lib/python2.7/site-packages/urllib3/__init__.pyc'

So...what这到底是怎么回事?

更新

下面是完整的堆栈跟踪:

代码语言:javascript
复制
Traceback (most recent call last):
  File "testkube.py", line 13, in <module>
    for event in w.stream(api.list_pod_for_all_namespaces):
  File "/usr/lib/python2.7/site-packages/kubernetes/watch/watch.py", line 116, in stream
    resp = func(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/apis/core_v1_api.py", line 14368, in list_pod_for_all_namespaces
    (data) = self.list_pod_for_all_namespaces_with_http_info(**kwargs)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/apis/core_v1_api.py", line 14464, in list_pod_for_all_namespaces_with_http_info
    collection_formats=collection_formats)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 335, in call_api
    _preload_content, _request_timeout)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 148, in __call_api
    _request_timeout=_request_timeout)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 371, in request
    headers=headers)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/rest.py", line 250, in GET
    query_params=query_params)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/rest.py", line 223, in request
    headers=headers)
  File "/usr/lib/python2.7/site-packages/urllib3/request.py", line 66, in request
    **urlopen_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/request.py", line 87, in request_encode_url
    return self.urlopen(method, url, **extra_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/poolmanager.py", line 321, in urlopen
    response = conn.urlopen(method, u.request_uri, **kw)
  File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 668, in urlopen
    **response_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 668, in urlopen
    **response_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 668, in urlopen
    **response_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python2.7/site-packages/urllib3/util/retry.py", line 388, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='192.168.122.140', port=8443): Max retries exceeded with url: /api/v1/pods?watch=True (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x3d16110>: Failed to establish a new connection: [Errno 111] Connection refused',))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 18:50:41

您的代码间接依赖于requests包,而requests包有一个名为requests.packages的奇怪子模块。这曾经包含从许多依赖项(包括urllib3 )复制的源代码,但是他们停止了这样做。不过,他们希望保持requests.packages的向后兼容性,所以现在他们正在做一些奇怪的事情。

它现在没有导入requests.packages (包括urllib3源代码的完整副本),而是导入urllib3并设置sys.modules['requests.packages.urllib3'] = urllib3。根据requests版本的不同,它也可以设置许多其他的sys.modules条目;例如,对于请求2.18.4,源代码可以设置

代码语言:javascript
复制
for package in ('urllib3', 'idna', 'chardet'):
    locals()[package] = __import__(package)
    # This traversal is apparently necessary such that the identities are
    # preserved (requests.packages.urllib3.* is urllib3.*)
    for mod in list(sys.modules):
        if mod == package or mod.startswith(package + '.'):
            sys.modules['requests.packages.' + mod] = sys.modules[mod]

但在2.17.0中,它确实

代码语言:javascript
复制
import urllib3
sys.modules['requests.packages.urllib3'] = urllib3

import idna
sys.modules['requests.packages.idna'] = idna

import chardet
sys.modules['requests.packages.chardet'] = chardet

此代码与导入包的子模块交互很差。如果一些代码尝试执行import requests.packages.urllib3.exceptions,而Python没有找到sys.modules['requests.packages.urllib3.exceptions']条目,Python将重新创建urllib3.exceptions模块,并将urllib3.exceptionssys.modules['requests.packages.urllib3.exceptions']设置为新模块(但不会触及sys.modules['urllib3.exceptions'] )。这将生成涉及的类的新副本,从而导致您的错误。

同样原因的一个相关问题是5月份的已报告,导致了2.18.4中所示的新代码。2.18.4不应该引起您所看到的特定问题,但是它仍然是脆弱的,因为如果urllib3的任何子模块在使用sys.modulesrequests.packages螺丝时还没有加载,那么这些子模块将显示出与现在相同的问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46715586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档