python https RecursionError详解

RecursionError: maximum recursion depth exceeded while calling a Python object

File "/root/miniconda3/envs/devops/lib/python3.8/site-packages/urllib3/connectionpool.py", line 699, in urlopen

httplib_response = self._make_request(

File "/root/miniconda3/envs/devops/lib/python3.8/site-packages/urllib3/connectionpool.py", line 382, in _make_request

self._validate_conn(conn)

File "/root/miniconda3/envs/devops/lib/python3.8/site-packages/urllib3/connectionpool.py", line 1010, in _validate_conn

conn.connect()

File "/root/miniconda3/envs/devops/lib/python3.8/site-packages/urllib3/connection.py", line 392, in connect

self.ssl_context = create_urllib3_context(

File "/root/miniconda3/envs/devops/lib/python3.8/site-packages/urllib3/util/ssl_.py", line 312, in create_urllib3_context

context.options |= options

File "/root/miniconda3/envs/devops/lib/python3.8/ssl.py", line 602, in options

super(SSLContext, SSLContext).options.__set__(self, value)

File "/root/miniconda3/envs/devops/lib/python3.8/ssl.py", line 602, in options

super(SSLContext, SSLContext).options.__set__(self, value)

File "/root/miniconda3/envs/devops/lib/python3.8/ssl.py", line 602, in options

super(SSLContext, SSLContext).options.__set__(self, value)

[Previous line repeated 468 more times]

RecursionError: maximum recursion depth exceeded while calling a Python object

注意看上面特殊颜色标注的内容,表示超过了468的深度。

问题原因:

1)代码问题,逻辑编写错误导致了递归溢出,比如代码小白,写个递归死循环了。这种情况不适用本篇文章。

2) 代码太庞大了,调用深度太深!

问题翻译解释: 超过最大递归深度,当然这个只是字面意思。其实是可以复现这个问题的

问题深度解析:

python有调用深度控制,默认是1000,我们可以通过sys.setrecursionlimit(N)来设置调用深度为N;报错的意思虽然是说递归深度超过限制,但不要局限于递归问题,其实也是调用堆栈的问题,涉及到C的一些基础....

比如以下代码,设置递归深度为20时,会报错RecursionError,然后改成21便可以正常结束。这里如果不调用traceback函数,其实只需要设置成8就足够了。

import sys
#使用内置的包traceback可以获得堆栈信息
import traceback
#改成21的深度就可以正常,
sys.setrecursionlimit(20)
def a():
    index = 0
    #到这个函数只需要8层就足够了,但是下面的traceback.format_stack里面还有,超出了当前运行的py设置的深度,一样会报错
    #不要这段for循环,上面setrecursionlimit(8)就可以了
    for line in traceback.format_stack():
        index +=1
        print("当前位置调用深度:%s,详细堆栈:%s" % (index, line.strip()))
    return "调用结束"
def b():
    return a()
def c():
    return b()
def d():
    return c()
def e():
    return d()
def f():
    return e()
print(f())

运行结果如下:

正常的输出结果如下:

调用深度:1,详细堆栈:File "D:/my_code/pycde/testtss.py", line 21, in <module>
    print(f())
调用深度:2,详细堆栈:File "D:/my_code/pycde/testtss.py", line 19, in f
    return e()
调用深度:3,详细堆栈:File "D:/my_code/pycde/testtss.py", line 17, in e
    return d()
调用深度:4,详细堆栈:File "D:/my_code/pycde/testtss.py", line 15, in d
    return c()
调用深度:5,详细堆栈:File "D:/my_code/pycde/testtss.py", line 13, in c
    return b()
调用深度:6,详细堆栈:File "D:/my_code/pycde/testtss.py", line 11, in b
    return a()
调用深度:7,详细堆栈:File "D:/my_code/pycde/testtss.py", line 6, in a
    for line in traceback.format_stack():
调用结束

解决方案:

如果看懂了解析,就明白了为什么会报错RecursionError,一般用开源的项目,或者项目架构的过深,就会导致层层套娃。

#设置递归深度为很大很大,比如设置成10000。正常的程序架构都不会调用深度超过10000

不要设置太大!这个机制是为了避免真的出现代码逻辑问题时,无限的递归死循环导致OOM系统崩溃。内存CPU打爆=>会出现什么结果? 嗯,很卡,然后你logout一下就登不进去了,然后就哦豁挂了,,,

import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(10000)

django项目只需要在manage.py的上面设置这个就可以了

至于网上说这个是临时解决的方案,其实就是永久方案.,大部分文章是抄袭之后知其然不知其所以然,所以觉得没有永久解决问题。

常见发生的库有哪些

与https有关的模块,真的很深.... boto3 玩转 amazon 就几百层。然后钉钉关联的模块,但凡用到https的,很多会调用到ssl模块,也很深

D:\桌面\aa\.venv\Scripts\python.exe D:\桌面\aa\图形学.py Traceback (most recent call last): File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\connection.py", line 198, in _new_conn sock = connection.create_connection( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\util\connection.py", line 85, in create_connection raise err File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\util\connection.py", line 73, in create_connection sock.connect(sa) TimeoutError: timed out The above exception was the direct cause of the following exception: Traceback (most recent call last): File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen response = self._make_request( ^^^^^^^^^^^^^^^^^^^ File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request raise new_e File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request self._validate_conn(conn) File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn conn.connect() File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\connection.py", line 704, in connect self.sock = sock = self._new_conn() ^^^^^^^^^^^^^^^^ File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\connection.py", line 207, in _new_conn raise ConnectTimeoutError( urllib3.exceptions.ConnectTimeoutError: (<urllib3.connection.HTTPSConnection object at 0x000001A38B4537D0>, 'Connection to huggingface.co timed out. (connect timeout=10)') The above exception was the direct cause of the following exception: Traceback (most recent call last): File "D:\桌面\aa\.venv\Lib\site-packages\requests\adapters.py", line 667, in send resp = conn.urlopen( ^^^^^^^^^^^^^ File "D:\桌面\aa\.venv\Lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen retries = retries.increment( ^^^^^^^^^^^^^^^^^^ File "D:\桌面
03-23
### 解决 Python 程序中连接 huggingface.co 超时的问题 在运行涉及 `huggingface.co` 的大型模型加载过程中,可能会遇到诸如 `(MaxRetryError)` 或者 `ConnectTimeoutError` 类型的错误。这类问题通常由网络连接不稳定、代理设置不当或者 SSL 验证失败等原因引起。 #### 1. **降低 urllib3 版本** 某些情况下,较新的 `urllib3` 版本可能存在兼容性问题,尤其是在通过 SOCKS5 代理访问 HTTPS 地址时会触发 SSL 校验 Bug[^2]。可以通过卸载当前版本并安装特定稳定版来解决问题: ```bash pip uninstall urllib3 pip install urllib3==1.25.11 ``` 此方法适用于因版本更新引入的新问题而导致的连接异常情况。 --- #### 2. **调整请求超时时间** 默认情况下,HTTP 请求可能具有较低的超时阈值,在下载较大文件或网络延迟较高时容易引发超时错误。可以尝试增加超时参数以延长等待时间。例如,使用 `transformers` 库中的自定义 HTTP 参数: ```python import transformers from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session = transformers.file_utils.http_session() retries = Retry(total=5, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504]) adapter = HTTPAdapter(max_retries=retries) session.mount('https://', adapter) # 设置全局环境变量覆盖默认 session transformers.utils.hub.set_http_backend(session) ``` 上述代码片段通过重试机制增强了对临时网络中断的容忍度,并适当增加了最大重试次数和退避因子[^1]。 --- #### 3. **验证代理配置** 如果已经设置了代理但仍无法正常工作,则可能是代理本身存在问题或是未被正确识别。建议显式指定代理地址并通过命令行测试其有效性: ```bash export https_proxy=http://your-proxy-address:port export http_proxy=http://your-proxy-address:port ping huggingface.co curl -v https://huggingface.co/ ``` 对于 Python 中的应用场景,可利用如下方式强制应用代理规则: ```python import os os.environ['http_proxy'] = 'http://your-proxy-address:port' os.environ['https_proxy'] = 'http://your-proxy-address:port' # 测试是否生效 import requests response = requests.get("https://huggingface.co/") print(response.status_code) ``` 注意:部分企业防火墙会对 HTTPS 数据流实施额外的安全扫描措施,这可能导致显著延时甚至阻断连接行为[^3]。 --- #### 4. **禁用 SSL 验证(仅限调试阶段)** 作为最后手段,在开发环境中可以选择关闭 SSL 验证功能以便绕过潜在证书匹配问题。然而生产环境下强烈反对采用这种方法以免暴露安全隐患! ```python import ssl ssl._create_default_https_context = ssl._create_unverified_context # 使用 Transformers 加载资源时不校验服务器身份 model_name = "timm/convnext_nano.in12k_ft_in1k" from transformers import AutoModelForImageClassification AutoModelForImageClassification.from_pretrained(model_name) ``` 尽管如此,仍需谨慎评估风险收益比后再决定是否采纳该策略。 --- ### 总结 综合以上分析可知,针对 `huggingface.co` 上发生的 `ConnectTimeoutError` 错误现象可以从以下几个角度入手排查修复: - 升级或降级依赖库至适配状态; - 增强网络层健壮性设计; - 明确化外部服务接入途径; - 权衡安全性需求灵活应对特殊状况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值