Python 更改为boto get_bucket后Amazon S3的连接关闭错误

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

昨天,我开始在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, 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)
,这就是文件的本地副本被删除的地方。