Ошибка закрытия соединения с Amazon S3 после перехода на boto get_bucket - PullRequest
0 голосов
/ 07 марта 2012

Вчера я начал использовать Amazon S3 с boto, я установил скрипт на python для создания корзины и загрузки изображений в каталог. Я запускал его несколько раз, и, похоже, все было в порядке.

Однако я не хочу постоянно создавать сегменты, поэтому я адаптировал свой скрипт для get_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')

Ошибка исходит из строки key.set_contents_from_filename(filename)

Этот код по сути представляет собой пример кода из руководства по началу работы с S3, которое я поместил в цикл. Я предполагаю, что проблема в том, что это здорово делать вещи с первого раза, но недостаточно надежна, чтобы справиться с перезаписью и т. Д. Нужно ли давать бото больше, чем просто имя файла для загрузки?

Выходные данные из сценария:

 [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

Я новичок во всем этом, включая Python, поэтому любая помощь будет принята:)

1 Ответ

1 голос
/ 07 марта 2012

Ваш код выглядит нормально, хотя одно маленькое, не связанное с этим предложение - установить политику ACL для файла во время записи файла, а не как отдельный шаг, например:

key.set_contents_from_filename(filename, policy='public-read')

Я попробовал ваш код локально, и он работал просто отлично.Я не уверен, почему вы получаете исключение для сокета, но действительно странным является то, что boto должен перехватить это исключение и повторить запрос автоматически.

Было бы полезно получить некоторую запись в журнал отладки.Вы можете включить полное ведение журнала отладки на консоли следующим образом:

import boto
boto.set_stream_logger('foo')
...
s3 = boto.connect_s3(debug=2)

Это может предоставить дополнительную информацию о происходящем.

...