如何解决python dropbox上载脚本中的超时错误?
我目前正在做一个项目,用覆盆子pi3做一个时间点(效果很好,拍摄照片不是问题) 然而,我使用另一个脚本将这些照片上传到dropbox帐户,它工作得很好,直到今天我签出它,看到超时错误 有人知道这是怎么解决的吗 这就是错误:如何解决python dropbox上载脚本中的超时错误?,python,raspberry-pi3,dropbox,Python,Raspberry Pi3,Dropbox,我目前正在做一个项目,用覆盆子pi3做一个时间点(效果很好,拍摄照片不是问题) 然而,我使用另一个脚本将这些照片上传到dropbox帐户,它工作得很好,直到今天我签出它,看到超时错误 有人知道这是怎么解决的吗 这就是错误: Traceback (most recent call last): File "/home/pi/.local/lib/python3.5/site-packages/urllib3/contrib/pyopenssl.py", line 453, in wrap_so
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/contrib/pyopenssl.py", line 453, in wrap_socket
cnx.do_handshake()
File "/usr/lib/python3/dist-packages/OpenSSL/SSL.py", line 1426, in do_handshake
self._raise_ssl_error(self._ssl, result)
File "/usr/lib/python3/dist-packages/OpenSSL/SSL.py", line 1149, in _raise_ssl_error
raise WantReadError()
OpenSSL.SSL.WantReadError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py", line 343, in _make_request
self._validate_conn(conn)
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py", line 839, in _validate_conn
conn.connect()
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connection.py", line 344, in connect
ssl_context=context)
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/util/ssl_.py", line 344, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/contrib/pyopenssl.py", line 456, in wrap_socket
raise timeout('select timed out')
socket.timeout: select timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.5/site-packages/requests/adapters.py", line 449, in send
timeout=timeout
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py", line 638, in urlopen
_stacktrace=sys.exc_info()[2])
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/util/retry.py", line 367, in increment
raise six.reraise(type(error), error, _stacktrace)
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/packages/six.py", line 686, in reraise
raise value
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py", line 600, in urlopen
chunked=chunked)
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py", line 346, in _make_request
self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)
File "/home/pi/.local/lib/python3.5/site-packages/urllib3/connectionpool.py", line 306, in _raise_timeout
raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='content.dropboxapi.com', port=443): Read timed out. (read timeout=30)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/pi/Desktop/time/picture/drop.py", line 16, in <module>
response = db.files_upload(f.read(), dname)
File "/home/pi/.local/lib/python3.5/site-packages/dropbox/base.py", line 2293, in files_upload
f,
File "/home/pi/.local/lib/python3.5/site-packages/dropbox/dropbox.py", line 274, in request
timeout=timeout)
File "/home/pi/.local/lib/python3.5/site-packages/dropbox/dropbox.py", line 365, in request_json_string_with_retry
timeout=timeout)
File "/home/pi/.local/lib/python3.5/site-packages/dropbox/dropbox.py", line 449, in request_json_string
timeout=timeout,
File "/home/pi/.local/lib/python3.5/site-packages/requests/sessions.py", line 581, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "/home/pi/.local/lib/python3.5/site-packages/requests/sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
File "/home/pi/.local/lib/python3.5/site-packages/requests/sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "/home/pi/.local/lib/python3.5/site-packages/requests/adapters.py", line 529, in send
raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='content.dropboxapi.com', port=443): Read timed out. (read timeout=30)
>>>
新错误:
回溯(最近一次呼叫最后一次):
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/contrib/pyopenssl.py”,第317行,在发送之前
返回self.connection.send(数据)
文件“/usr/lib/python3/dist packages/OpenSSL/SSL.py”,第1256行,在send中
self.\u raise\u ssl\u错误(self.\u ssl,结果)
文件“/usr/lib/python3/dist-packages/OpenSSL/SSL.py”,第1151行,出现错误
引发WantWriteError()
OpenSSL.SSL.WantWriteError
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/connectionpool.py”,第600行,在urlopen中
分块=分块)
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/connectionpool.py”,第354行,在请求中
conn.request(方法,url,**httplib\u request\u kw)
请求中的文件“/usr/lib/python3.5/http/client.py”,第1107行
self.\u发送请求(方法、url、正文、标题)
文件“/usr/lib/python3.5/http/client.py”,第1152行,在发送请求中
self.endheaders(主体)
文件“/usr/lib/python3.5/http/client.py”,第1103行,在endheaders中
自发送输出(消息体)
文件“/usr/lib/python3.5/http/client.py”,第936行,在发送输出中
self.send(消息体)
文件“/usr/lib/python3.5/http/client.py”,第908行,在send中
self.sock.sendall(数据)
sendall中的文件“/home/pi/.local/lib/python3.5/site packages/urlib3/contrib/pyopenssl.py”,第328行
发送=自。发送直到完成(数据[发送总数:发送总数+SSL写入块大小])
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/contrib/pyopenssl.py”,第320行,在发送之前
提升超时()
套接字超时
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/home/pi/.local/lib/python3.5/site packages/requests/adapters.py”,第449行,在send中
超时=超时
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/connectionpool.py”,第638行,在urlopen中
_stacktrace=sys.exc_info()[2])
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/util/retry.py”,第367行,增量
升起六个。重新升起(类型(错误),错误,_stacktrace)
文件“/home/pi/.local/lib/python3.5/site-packages/urllib3/packages/six.py”,第685行,重新登录
通过_回溯(tb)提升值
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/connectionpool.py”,第600行,在urlopen中
分块=分块)
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/connectionpool.py”,第354行,在请求中
conn.request(方法,url,**httplib\u request\u kw)
请求中的文件“/usr/lib/python3.5/http/client.py”,第1107行
self.\u发送请求(方法、url、正文、标题)
文件“/usr/lib/python3.5/http/client.py”,第1152行,在发送请求中
self.endheaders(主体)
文件“/usr/lib/python3.5/http/client.py”,第1103行,在endheaders中
自发送输出(消息体)
文件“/usr/lib/python3.5/http/client.py”,第936行,在发送输出中
self.send(消息体)
文件“/usr/lib/python3.5/http/client.py”,第908行,在send中
self.sock.sendall(数据)
sendall中的文件“/home/pi/.local/lib/python3.5/site packages/urlib3/contrib/pyopenssl.py”,第328行
发送=自。发送直到完成(数据[发送总数:发送总数+SSL写入块大小])
文件“/home/pi/.local/lib/python3.5/site packages/urllib3/contrib/pyopenssl.py”,第320行,在发送之前
提升超时()
urllib3.exceptions.ProtocolError:(“连接中止”,超时())
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/home/pi/Desktop/time/bild/drop.py”,第20行,在
响应=上传(f,dname)
文件“/usr/local/lib/python3.5/dist packages/backoff/_sync.py”,第94行,在重试中
ret=目标(*args,**kwargs)
文件“/home/pi/Desktop/time/bild/drop.py”,第11行,上传
返回db.files\u上载(f.read(),dname)
文件“/home/pi/.local/lib/python3.5/site packages/dropbox/base.py”,第2293行,在文件上传中
F
请求中的文件“/home/pi/.local/lib/python3.5/site packages/dropbox/dropbox.py”,第274行
超时=超时)
文件“/home/pi/.local/lib/python3.5/site packages/dropbox/dropbox.py”,第365行,在请求\u json\u字符串\u中,带有\u retry
超时=超时)
文件“/home/pi/.local/lib/python3.5/site packages/dropbox/dropbox.py”,第449行,请求字符串
超时=超时,
文件“/home/pi/.local/lib/python3.5/site packages/requests/sessions.py”,post第581行
return self.request('POST',url,data=data,json=json,**kwargs)
文件“/home/pi/.local/lib/python3.5/site packages/requests/sessions.py”,请求中的第533行
resp=自我发送(准备,**发送)
文件“/home/pi/.local/lib/python3.5/site packages/requests/sessions.py”,第646行,在send中
r=适配器.send(请求,**kwargs)
文件“/home/pi/.local/lib/python3.5/site packages/requests/adapters.py”,第498行,在send中
raise CONNECTIONERR(错误,请求=请求)
requests.exceptions.ConnectionError:('Connection aborted',timeout())
在实现处理超时的代码之前,首先需要考虑如何处理超时。一个共同的战略是:
- 尝试重新上传一定次数,可能与(例如使用)结合使用
- 如果失败,请跳过当前映像或完全中止进程
import dropbox
from time import sleep
db = dropbox.Dropbox('apikeyplaceholder')
for i in range(4500): ##4500
name = 'image{0:04d}.jpg'
fname = '/home/pi/Desktop/time/picture/'+name.format(i)
dname = '/'+name.format(i)
f = open(fname, 'rb')
response = db.files_upload(f.read(), dname)
print ('uploaded:', response)
sleep(585)
f.close()
from time import sleep
import backoff
import dropbox
import requests
db = dropbox.Dropbox('apikeyplaceholder')
@backoff.on_exception(backoff.expo, requests.exceptions.ReadTimeout)
def upload(f, name):
return db.files_upload(f.read(), dname)
NAME_PATTERN = '/image{0:04d}.jpg'
for i in range(4500):
name = NAME_PATTERN.format(i)
fname = '/home/pi/Desktop/time/picture' + name
with open(fname, 'rb') as f:
response = upload(f, name)
print ('uploaded:', response)
sleep(585)