在VFX合成软件Nuke中调用requests库出现递归深度错误求助
Nuke中使用requests触发递归错误的解决线索
问题根因分析
从报错堆栈来看,递归死循环出现在Nuke自带的shiboken2/typing27.py和你便携Python环境中的typing.py之间,两者在执行issubclass检查时互相调用,导致无限递归。这不是requests版本本身的问题,而是Nuke的Python环境与你便携Python的第三方依赖(尤其是typing模块)冲突导致的。
可行解决方向
1. 隔离冲突的依赖路径
在导入requests之前,先从sys.path中移除便携Python的site-packages目录,避免Nuke加载到冲突的typing模块:
import sys # 遍历并移除包含python_portable的路径 for path in list(sys.path): if 'python_portable' in path: sys.path.remove(path) # 再导入requests执行请求 import requests url = 'xxxxxxxx.com/my_work' data = {'field_to_query_01': 4444, 'field_to_query_02': 'Pending'} requests.get(url, params=data) # 注意GET请求推荐用params参数,data是POST的参数
提示:GET请求应该用
params参数而不是data,requests中data主要用于POST请求,虽然GET也能识别,但语义上更规范的是用params。
2. 改用Python标准库实现HTTP请求
直接使用Python2.7自带的urllib2和urllib库,完全避免第三方依赖冲突:
import urllib import urllib2 url = 'xxxxxxxx.com/my_work' data = {'field_to_query_01': 4444, 'field_to_query_02': 'Pending'} # 编码参数并拼接到URL(GET请求的标准做法) encoded_params = urllib.urlencode(data) full_url = f"{url}?{encoded_params}" if '?' not in url else f"{url}&{encoded_params}" try: response = urllib2.urlopen(full_url) result = response.read() # 处理返回结果 print(result) except urllib2.URLError as e: # 处理请求错误 print(f"请求失败: {e}")
3. 调整Nuke的Python路径优先级
检查Nuke启动时的sys.path顺序,确保Nuke自带的Python库路径(比如C:\Program Files\Nuke12.2v10\python27.zip、C:\Program Files\Nuke12.2v10\pythonextensions\site-packages)排在你便携Python的路径前面。可以在Nuke的启动脚本中调整sys.path的顺序,避免优先加载第三方环境的依赖。
内容的提问来源于stack exchange,提问作者nish
相关产品推荐
相关产品推荐

