2016-11-01 2 views
2

Я создал эту простую программу python, которая отправляет сообщение в SQS, а затем извлекает его. Он работает с использованием python 2.7.11.Как 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 

Я тогда cxFreeze его с помощью этого сценария:

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) 

Затем я получаю эту ошибку, когда я пытаюсь запустить замороженном код

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 

В дополнение к этой проблеме, библиотеки похоже, динамически загружают службы, которые не являются s3, dynamo или еще одной услугой.

Есть ли рецепт замораживания boto3?

+0

вы открыты к использованию другие пакеты для замораживания? – helloV

+0

Не совсем. Что у тебя на уме ? – jeremyvillalobos

+0

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

ответ

2

Ошибка показывает, что происходит скрытый (динамический) импорт. Если вы включите модуль, который он ищет (ConfigParser) в списке модулей, которые вы указываете cx_Freeze, он должен работать. Возможно, вам придется делать это несколько раз.

executables = [cx_Freeze.Executable("MyScript.py")] 
includes = ["ConfigParser"] 
buildOptions = dict(includes = includes) 
cx_Freeze.setup(name, description, options = dict(build_exe = buildOptions), 
     executables = executables) 

После того, как у вас есть рабочая программа, вы также можете сделать это, а не манипулировать своей конкретной setup.py. Вы можете добавить запись в модуль cx_Freeze.hooks, который выглядит примерно так:

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

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

https://bitbucket.org/anthony_tuininga/cx_freeze

0

Благодаря @Anthony Tuininga

Существовало несколько дополнительных шагов, которые я отправляю здесь:

Добавлены «ConfigParser» и «HTMLparser "Как отметил Энтони

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) 

экспорт AWS_DATA_PATH =/USR/местные/Библиотека/python2.7/Расс-пакеты/botocore/данныеот: requests.exceptions.SSLError: [Errno 2] No such file or directory

экспорта REQUESTS_CA_BUNDLE =/USR/местные/Библиотека/python2.7/расстояние-пакеты/botocore/vendored/запросы/cacert.pem

Используется код нижнего уровня для использования 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']

После этого SQS работает для сценария 'привет мир', размещенном на OP