Python 更改为boto get_bucket后Amazon S3的连接关闭错误
昨天,我开始在boto中使用AmazonS3,我设置了一个python脚本来创建一个bucket并将图像上传到一个目录中。我跑了好几次,看起来还不错 我不想不断地创建bucket,但是我调整了脚本以获得_bucket:Python 更改为boto get_bucket后Amazon S3的连接关闭错误,python,amazon-web-services,amazon-s3,boto,Python,Amazon Web Services,Amazon S3,Boto,昨天,我开始在boto中使用AmazonS3,我设置了一个python脚本来创建一个bucket并将图像上传到一个目录中。我跑了好几次,看起来还不错 我不想不断地创建bucket,但是我调整了脚本以获得_bucket: import os import boto s3 = boto.connect_s3() bucket = s3.get_bucket('images') # Run Selenium test process to create images for root, dir
import os
import boto
s3 = boto.connect_s3()
bucket = s3.get_bucket('images')
# Run Selenium test process to create images
for root, dirs, files in os.walk(imagesPath):
for name in files:
filename = os.path.join(root, name)
key = bucket.new_key('{0}/{1}/{2}'.format(revisionNumber, images_process, name))
print "Uploading " + filename + " to Amazon S3"
key.set_contents_from_filename(filename)
key.set_acl('public-read')
错误来自行键。从文件名(文件名)
这段代码基本上是S3入门指南中的两个示例代码,我将其放入了一个循环中。我想问题是,第一次做事情很好,但不够健壮,无法处理覆盖等。我是否必须给boto提供的不仅仅是要上传的文件名
脚本的输出为:
[exec] Uploading images/Add_Employer_Process/20227M/1.png to Amazon S3
[exec] Traceback (most recent call last):
[exec] File "addEmployerProcess.py", line 121, in <module>
[exec] k.set_contents_from_filename(filename)
[exec] File "C:\Python26\lib\site-packages\boto\s3\key.py", line 969, inset_contents_from_filename
[exec] encrypt_key=encrypt_key)
[exec] File "C:\Python26\lib\site-packages\boto\s3\key.py", line 902, inset_contents_from_file
[exec] size=size)
[exec] File "C:\Python26\lib\site-packages\boto\s3\key.py", line 660, insend_file
[exec] query_args=query_args)
[exec] File "C:\Python26\lib\site-packages\boto\s3\connection.py", line 449, in make_request
[exec] override_num_retries=override_num_retries)
[exec] File "C:\Python26\lib\site-packages\boto\connection.py", line 829, in make_request
[exec] return self._mexe(http_request, sender, override_num_retries)
[exec] File "C:\Python26\lib\site-packages\boto\connection.py", line 794, in _mexe
[exec] raise e
[exec] socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host
[exec]上传图片/Add_Employer_Process/20227M/1.png到Amazon S3
[exec]回溯(最近一次呼叫最后一次):
[exec]文件“addEmployerProcess.py”,第121行,在
[exec]k.从文件名(文件名)设置文件内容
[exec]文件“C:\Python26\lib\site packages\boto\s3\key.py”,第969行,插入文件名中的内容
[exec]加密密钥=加密密钥)
[exec]文件“C:\Python26\lib\site packages\boto\s3\key.py”,第902行,插入文件内容
[exec]大小=大小)
[exec]文件“C:\Python26\lib\site packages\boto\s3\key.py”,第660行,insend\u文件
[exec]query\u args=query\u args)
[exec]文件“C:\Python26\lib\site packages\boto\s3\connection.py”,第449行,在make\u请求中
[exec]覆盖次数重试次数=覆盖次数重试次数)
[exec]文件“C:\Python26\lib\site packages\boto\connection.py”,第829行,在make\u请求中
[exec]返回self.\u mexe(http\u请求、发送方、覆盖\u num\u重试)
[exec]文件“C:\Python26\lib\site packages\boto\connection.py”,第794行,在\u-mexe中
[exec]
[exec]socket.error:[Errno 10054]远程主机已强制关闭现有连接
我对所有这些都不熟悉,包括python,因此任何帮助都将不胜感激:)您的代码看起来不错,尽管有一个小的、不相关的建议是在编写文件时对文件设置ACL策略,而不是作为一个单独的步骤,如下所示:
key.set_contents_from_filename(filename, policy='public-read')
import boto
boto.set_stream_logger('foo')
...
s3 = boto.connect_s3(debug=2)
我在本地试用了你的代码,效果很好。我不知道为什么会出现套接字异常,但真正奇怪的是boto应该捕获该异常并自动重试请求
获取一些调试日志将非常有用。您可以像这样启用控制台的完全调试日志记录:
key.set_contents_from_filename(filename, policy='public-read')
import boto
boto.set_stream_logger('foo')
...
s3 = boto.connect_s3(debug=2)
这可能会提供有关正在发生的事情的更多信息。谢谢。该集合acl直接取自示例代码。这个错误似乎是我设法解决的超时问题,但我现在在家&记不起修复了。我确实将
get_bucket()
更改为lookup()
,但我不确定这会产生什么影响。我当然会记下调试命令,以防出现进一步的问题。谢谢。顺便说一句,lookup()实际上调用get_bucket()。它们之间唯一的区别是get_bucket()在未找到该bucket时抛出异常,而lookup返回None。所以这看起来没什么区别。好吧,那我回去拿桶。我现在能在代码中看到的唯一区别是,我在循环之后添加了time.sleep(2)
,这就是文件的本地副本被删除的地方。