2016-11-01 1 views
2

J'ai créé ce simple programme python qui envoie un message à SQS, puis le récupère. Cela fonctionne en utilisant python 2.7.11.Comment cx Freeze Boto3

import boto3 
sqs = boto3.client('sqs') 
queue = sqs.get_queue_by_name(QueueName='some-que-name') 
queue.send_message(MessageBody='{"phrase": "It\'s the end of the world as we know it" }') 
for message in queue.receive_messages(): 
    print message.body 

Je cxFreeze puis avec ce script:

from cx_Freeze import setup, Executable 

include_mods = [] 

excludes = ['tkinter', 'cltk'] 

buildOptions = dict(packages=[], excludes=excludes, includes=include_mods) 


executables = [ 
    Executable('./frozen_boto_3_test.py', 'Console') 
] 

setup(name='Boto3FrozenTest', 
    version='1', 
    description='A test to make sure boto3 is working well when frozen', 
    options=dict(build_exe=buildOptions), 
    executables=executables) 

je puis obtenir cette erreur lorsque je tente d'exécuter le code congelé

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/Console.py", line 27, in <module> 
    exec(code, m.__dict__) 
    File "./frozen_boto_3_test.py", line 1, in <module> 
    import boto3 
    File "/usr/local/lib/python2.7/site-packages/boto3/__init__.py", line 16, in <module> 
    from boto3.session import Session 
    File "/usr/local/lib/python2.7/site-packages/boto3/session.py", line 17, in <module> 
    import botocore.session 
    File "/usr/local/lib/python2.7/site-packages/botocore/session.py", line 25, in <module> 
    import botocore.configloader 
    File "/usr/local/lib/python2.7/site-packages/botocore/configloader.py", line 18, in <module> 
    from six.moves import configparser 
    File "/usr/local/lib/python2.7/site-packages/six.py", line 203, in load_module 
    mod = mod._resolve() 
    File "/usr/local/lib/python2.7/site-packages/six.py", line 115, in _resolve 
    return _import_module(self.mod) 
    File "/usr/local/lib/python2.7/site-packages/six.py", line 82, in _import_module 
    __import__(name) 
ImportError: No module named ConfigParser 

En plus de ce problème, la bibliothèque semble charger dynamiquement des services qui ne sont pas s3, dynamo, ou un autre service.

Y at-il une recette pour congeler boto3?

+0

Êtes-vous ouvert à l'utilisation d'autres paquets à geler? – helloV

+0

Pas vraiment. À quoi penses-tu ? – jeremyvillalobos

+0

http://www.pyinstaller.org/ – helloV

Répondre

2

L'erreur indique qu'une importation cachée (dynamique) est en cours. Si vous incluez le module (ConfigParser) dans la liste des modules que vous indiquez à cx_Freeze, cela devrait fonctionner. Vous devrez peut-être faire cela plusieurs fois. Une fois que vous avez un programme de travail, vous pouvez également le faire au lieu de manipuler votre setup.py spécifique. Vous pouvez ajouter une entrée dans le module cx_Freeze.hooks qui ressemble à ceci:

def load_boto3(finder, module): 
    finder.IncludeModule("ConfigParser") 

Inclure tous les autres que vous découvrirez le long du chemin. Ensuite, créez une demande de tirage ou question ici:

https://bitbucket.org/anthony_tuininga/cx_freeze

0

Merci @Anthony Tuininga

Il y avait quelques étapes supplémentaires que je signalerai ici:

Ajouté « ConfigParser » et « HTMLParser "comme l'a noté Anthony

from cx_Freeze import setup, Executable 

include_mods = ["ConfigParser", "HTMLParser"] 

excludes = ['tkinter', 'cltk'] 

buildOptions = dict(packages=[], excludes=excludes, includes=include_mods) 


executables = [ 
    Executable('./frozen_boto_3_test.py', 'Console') 
] 

setup(name='Boto3FrozenTest', 
    version='1', 
    description='A test to make sure boto3 is working well when frozen', 
    options=dict(build_exe=buildOptions), 
    executables=executables) 

export AWS_DATA_PATH =/usr/local/lib/python2.7/dist-paquets/botocore/données de: requests.exceptions.SSLError: [Errno 2] No such file or directory

export REQUESTS_CA_BUNDLE =/usr/local/lib/python2.7/dist-packages/botocore/vendored/demandes/cacert.pem

code de niveau inférieur Utilisé pour utiliser SQS:

import boto3 

sqs = boto3.client('sqs') 

queue = sqs.create_queue(QueueName="my-queue") 
sqs.send_message(QueueUrl=queue["QueueUrl"] , MessageBody='{"phrase": "It\'s the end of the world as we know it" }') 
message = sqs.receive_message(QueueUrl=queue["QueueUrl"]) 
for msg in message['Messages']: 
    print m 

sg [ 'Body']

Après cette SQS travaille pour le script 'bonjour' affiché sur le OP