2012-03-07 1 views
0

Hier, j'ai commencé à utiliser Amazon S3 avec boto, j'ai mis en place un script python pour créer un seau et télécharger des images dans un répertoire. Je l'ai couru plusieurs fois et ça semblait aller.Erreur de connexion fermée à partir d'Amazon S3 après avoir changé pour boto get_bucket

Je ne veux pas être constamment créer des seaux mais alors j'adapté mon script 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') 

L'erreur vient de la ligne key.set_contents_from_filename(filename)

Ce code est essentiellement Boto exemple de code de la S3 guide de démarrage que j'ai mis dans une boucle. Je suppose que le problème est que c'est génial de faire les choses la première fois, mais n'est pas assez robuste pour faire face à l'écrasement, etc. Dois-je donner à boto plus que le nom de fichier à télécharger?

La sortie du script est:

[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 

Je suis nouveau à tout cela, python inclus, de sorte que toute aide serait appréciée :)

Répondre

1

Votre code semble bien, bien qu'un petit, suggestion sans rapport serait de définir la stratégie d'ACL sur le fichier au moment où vous écrivez le fichier plutôt que comme une étape distincte, comme ceci:

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

J'ai essayé votre code localement et Wo rked très bien. Je ne suis pas sûr pourquoi vous obtenez l'exception de socket, mais la chose vraiment étrange est que boto devrait attraper cette exception et réessayer la demande automatiquement.

Il serait utile d'obtenir une journalisation de débogage. Vous pouvez activer la journalisation de débogage complet à la console comme ceci:

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

Cela pourrait fournir plus d'informations sur ce qui se passe.

+0

Merci. Ce set_acl a été extrait directement de l'exemple de code. L'erreur semble avoir été un problème de délai d'attente que j'ai réussi à résoudre, mais je suis à la maison maintenant et ne me souviens pas du correctif. J'ai changé le 'get_bucket()' en 'lookup()' mais je ne suis pas sûr de l'impact de cela. Je garderai certainement une note de cette commande de débogage en cas de problèmes supplémentaires. Merci. –

+0

BTW, lookup() appelle en réalité get_bucket(). La seule différence entre eux est get_bucket() jette une exception si le compartiment n'est pas trouvé et que lookup renvoie None. Donc, il ne semble pas que cela aurait dû faire une différence. – garnaat

+0

À droite, je vais revenir à get_bucket() alors. La seule différence que je peux voir maintenant dans mon code est que j'ai ajouté 'time.sleep (2)' après la boucle qui alors est où la copie locale des fichiers est supprimée. –

Questions connexes