2015-09-24 1 views
2

Je peux télécharger des données sans aucun problème en utilisant l'interpréteur python 2.7 sur Windows. Mais après que je compile à exe, il indique l'erreur à la ligne: s3 = session.client('s3')Après la conversion de python en exe botocore.exceptions.DataNotFoundError

import HTMLParser 
import ConfigParser 
# Above packages necessary because boto3 depend on them 
import boto3 
from boto3.session import Session 
# variable initialization 
session = boto3.session.Session() 
s3 = session.client('s3') #Error at this line 
s3.upload_file(fileToUpload, bucketName, keyName) 

erreur est:

Traceback (most recent call last): 
    File "myProg.py", line 39, in <module> 
    File "boto3\session.pyc", line 199, in client 
    File "botocore\session.pyc", line 754, in create_client 
    File "botocore\session.pyc", line 660, in get_component 
    File "botocore\session.pyc", line 774, in get_component 
    File "botocore\session.pyc", line 174, in <lambda> 
    File "botocore\session.pyc", line 453, in get_data 
    File "botocore\loaders.pyc", line 119, in _wrapper 
    File "botocore\loaders.pyc", line 364, in load_data 
botocore.exceptions.DataNotFoundError: Unable to load data for: _endpoints 

Ce qui pourrait être le problème?

Répondre

3

C'est parce que boto3 n'a pas pu trouver ses fichiers de données.

Dans ce cas, Python27 \ Lib \ site-packages \ botocore \ data contient des fichiers de données. Nous devons ordonner à boto3 de les rechercher dans le dossier de données dans le même répertoire que notre module principal. Ensuite, nous devons demander à py2exe de regrouper les paquets référencés, et les fichiers de données avec EXE.

fourni les fichiers de données

copy C:\Python27\Lib\site-packages\botocore\data <project_root>\data 
xcopy /s /i C:\Python27\Lib\site-packages\botocore\data\s3 <project_root>\data\s3 

fourni le cacert.pem

copy C:\Python27\Lib\site-packages\botocore\vendored\requests\cacert.pem <project_root>\data 

Et puis re-écrit mon code comme:

import boto3 
from boto3.session import Session 

CACERT = 'data/cacert.pem' 
session = boto3.session.Session() 
session._loader.search_paths.append('data') # boto3 will search for data files in the 'data' folder within current directory 
s3 = session.client('s3', use_ssl=True, verify=CACERT) # cacert.pem will be used for SSL 
s3.upload_file(fileToUpload, bucketName, keyName) 

Maintenant, mon module python utilise des ressources à l'intérieur du <project_root>\data au lieu de C:\Python27\Lib\site-packages\botocore\dataFinalement, le setup.py ordonne à py2exe d'inclure tous les fichiers de données et les paquets référencés dans la distribution.

from distutils.core import setup 
import py2exe 

aws_data_files = [ 
        ('data', ['data/_endpoints.json','data/_retry.json', 'data/cacert.pem']), 
        ('data/s3/2006-03-01', ['data/s3/2006-03-01/service-2.json']) 
       ] 
setup(
     options = { 
      'py2exe': { 
       'bundle_files': 1, 
       'compressed': True, 
       'dll_excludes':['w9xpopen.exe','crypt32.dll'], 
       'packages': ['HTMLParser', 'ConfigParser', 'boto3.s3.inject'], 
       } 
      }, 
     console=['myProg.py'], 
     zipfile = None, 
     data_files = aws_data_files, 
    ) 

réponse est extrait de cette issue grâce à jamesls et rayluo.

+1

J'ai rencontré le même problème, et votre réponse m'a aidé à créer * .app pour Mac OS. Merci! –

+0

** Considérez voter ** si vous avez trouvé ma réponse utile – Nilesh

-1

Je réponds à ma propre question.

En ajoutant à la suite SSFE-fichiers

('data/s3/2006-03-01', [ 'data/s3/2006-03-01/paginators-1.json']) ('data/s3/2006-03-01', ['data/s3/2006-03-01/waiters-2.json'])

Cela fonctionne maintenant comme prévu.