我在以下远程服务器设置上使用Python 3.6.5:
服务器:Windows 10
Python:3.6.5
请求:2.18.4
Pentaho:8.0
当我对服务器命令提示符中的URL运行request.get
时,它会按预期获得JSON:
>>> import requests
>>> response = requests.get(url, headers=headers)
>>> json = response.json()
>>> print(json)
{'d': {'results': [{'_ ...
然而,当我在CPython中为Pentaho 8.0运行相同的脚本时,我得到了
RecursionError:超出最大递归深度
完整日志:
2018/04/13 15:02:17 - Get SP Doc List.0 - ERROR (version 8.0.0.0-28, build 8.0.0.0-28 from 2017-11-05 07.27.50 by buildguy) : Unexpected error
2018/04/13 15:02:17 - Get SP Doc List.0 - ERROR (version 8.0.0.0-28, build 8.0.0.0-28 from 2017-11-05 07.27.50 by buildguy) : org.pentaho.di.core.exception.KettleException:
2018/04/13 15:02:17 - Get SP Doc List.0 - Traceback (most recent call last):
File "C:\Users\ADMINI~1\AppData\Local\Temp\2\pyServer.py", line 299, in execute_script
exec (script, _global_env)
File "<string>", line 16, in <module>
File "C:\Program Files\Python36\lib\site-packages\requests\api.py", line 72, in get
return request('get', url, params=params, **kwargs)
File "C:\Program Files\Python36\lib\site-packages\requests\api.py", line 58, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Program Files\Python36\lib\site-packages\requests\sessions.py", line 508, in request
resp = self.send(prep, **send_kwargs)
File "C:\Program Files\Python36\lib\site-packages\requests\sessions.py", line 618, in send
r = adapter.send(request, **kwargs)
File "C:\Program Files\Python36\lib\site-packages\requests\adapters.py", line 440, in send
timeout=timeout
File "C:\Program Files\Python36\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen
chunked=chunked)
File "C:\Program Files\Python36\lib\site-packages\urllib3\connectionpool.py", line 346, in _make_request
self._validate_conn(conn)
File "C:\Program Files\Python36\lib\site-packages\urllib3\connectionpool.py", line 850, in _validate_conn
conn.connect()
File "C:\Program Files\Python36\lib\site-packages\urllib3\connection.py", line 314, in connect
cert_reqs=resolve_cert_reqs(self.cert_reqs),
File "C:\Program Files\Python36\lib\site-packages\urllib3\util\ssl_.py", line 269, in create_urllib3_context
context.options |= options
File "C:\Program Files\Python36\lib\ssl.py", line 465, in options
super(SSLContext, SSLContext).options.__set__(self, value)
File "C:\Program Files\Python36\lib\ssl.py", line 465, in options
super(SSLContext, SSLContext).options.__set__(self, value)
File "C:\Program Files\Python36\lib\ssl.py", line 465, in options
super(SSLContext, SSLContext).options.__set__(self, value)
[Previous line repeated 322 more times]
RecursionError: maximum recursion depth exceeded
脚本:
import requests
import json
# By Filename
url = "https://myco.sharepoint.com/teams/dg/l/_api/web/lists/GetByTitle('eRetail%20Data%20Sources')/items?..."
authtoken = "Bearer eyJ..."
headers = {
"Content-Type": "application/json;odata=verbose",
"Accept": "application/json;odata=verbose",
"Authorization": authtoken
}
response = requests.get(url, headers=headers)
json = response.json()
print('===========================')
print(json)
答案 0 :(得分:4)
如果安装了gevent
,则需要对python socket
进行猴子补丁合作(请参阅documentation或this github issue)。
因此gevent.monkey.patch_all()
丢失或没有足够早地被调用。
# at the beginning of the script
import gevent.monkey
gevent.monkey.patch_all()
# all the other stuff below, like for example
import requests
答案 1 :(得分:1)
请勿猴子修补ssl:
from gevent import monkey
monkey.patch_all(ssl=False)
答案 2 :(得分:1)
from gevent import monkey as curious_george
# curious_george.patch_all(thread=False, select=False)
def stub(*args, **kwargs): # pylint: disable=unused-argument
pass
答案 3 :(得分:0)
<强>更新强>
我发现我的问题是因为我在我的应用程序的另一个地方引入了locust,它使用了gevent == 1.2.2。在我注释掉gevent import语句之后,这个递归问题就消失了。如果您在应用程序中的某个位置引入了gevent,那么值得一试。
我最近遇到了同样的错误,并没有找到任何解决方法。在我的情况下我不得不使用http而不是https,尽管它确实危险。