Как скомпилировать код Python, который использует boto для доступа к S3? - PullRequest
1 голос
/ 30 сентября 2010

Я пытаюсь скомпилировать простую программу на Python, которая загружает файлы в корзину S3 с помощью пакета boto в один распространяемый файл .exe.Я открыт для любого метода компиляции.До сих пор я пробовал оба bbfreeze и py2exe, и оба дают одинаковые результаты.Код, который вызывает проблемы, выглядит следующим образом:

import boto
#...snip...
fname_base = os.path.basename(fname)
s3 = boto.connect_s3(aws_access_key_id=_aws_key, aws_secret_access_key=_aws_secret_key, is_secure=False);
bucket = s3.get_bucket(_bucket)
key = bucket.new_key(fname_base)
key.set_contents_from_filename(fname)

Скомпилирован с помощью исполняемой утилиты связывания и запускаю, я получаю:

Traceback (most recent call last):
  File "s3stash.py", line 238, in <module>
    sys.exit(main())
  File "s3stash.py", line 225, in main
    push_file_to_s3(f, options)
  File "s3stash.py", line 160, in push_file_to_s3
    _push_with_boto(fname)
  File "s3stash.py", line 148, in _push_with_boto
    s3 = boto.connect_s3(aws_access_key_id=_aws_key, aws_secret_access_key=_aws_secret_key, is_secure=False);
  File "boto\__init__.pyo", line 104, in connect_s3
  File "zipextimporter.pyo", line 82, in load_module
  File "boto\s3\connection.pyo", line 27, in <module>
  File "zipextimporter.pyo", line 82, in load_module
  File "boto\utils.pyo", line 55, in <module>
  File "email\__init__.pyo", line 79, in __getattr__
ImportError: No module named multipart

Я использую ActiveState Python 2.6 в Windows XPSP3.Пакет boto был установлен с:

easy_installer --always-unzip boto

Я использовал опцию --always-unzip, основываясь на информации , найденной здесь о py2exe, имеющей проблемы с распакованными яйцами.К сожалению, я получаю ту же ошибку, когда использую bb-freeze для создания исполняемого файла.

Вывод py2exe включает в конце следующую информацию:

The following modules appear to be missing
['_scproxy', 'email.Encoders', 'email.MIMEBase', 'email.MIMEMultipart', 'email.MIMEText', 'email.Utils', 'simplejson']

Что дает некоторые подсказки.Я попробовал методы, предложенные в других постах SO, где опция -i была рекомендована при компиляции с py2exe, и, к сожалению, ничего не помогло.В этих других вопросах пользователи делали свое собственное явное включение субмодулей электронной почты.К сожалению, я не мог понять, как адаптировать эти решения к моему случаю, и простое добавление их с помощью -i не помешало py2exe предупредить меня о отсутствующих модулях или о том, что полученный пакетный exe-файл не выполнил ошибку отсутствующего модуля.

Может кто-нибудь помочь мне собрать этот код для распространения?

Ответы [ 3 ]

1 голос
/ 11 февраля 2012

Я знаю, что это старый вопрос, но у меня была та же проблема, и я исправил ее, все еще используя py2exe и py2app.Просто используйте параметр «пакеты» вместо «включает» в вашем файле setup.py:

extra = {}
mainscript = "foo/__main__.py"

if is_os_x():
    extra["setup_requires"] =['py2app']
    extra["app"] = [mainscript]
    extra["options"] = { "py2app": {
        "packages": ['email'],
        }                                       
    }

elif is_windows():
    extra["setup_requires"] =['py2exe']
    extra['console'] = [mainscript]
    extra['options'] = {'py2exe': {
        # Includes that py2exe doesn't include automatically
       'packages': ['email'],
       }
    }

setup(
    # snip
    ** extra
)   

Надеюсь, что это поможет.

1 голос
/ 13 ноября 2012

Мне удалось создать рабочий exe с помощью boto & py2exe

Добавить в свой скрипт.py

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

Следующая ошибка связана с HTTPS-соединением, кажется, что py2exe как-то "скрывает" файл сертификата .. Способ исправить это 1) использовать HTTP ИЛИ ЖЕ 2) не проверяйте сертификаты

1) HTTP

conn = boto.connect_dynamodb(
    aws_access_key_id = ' ',
    aws_secret_access_key = ' ', 
    is_secure = False)

"is_secure = False" имеет решающее значение

2) НЕ ПРОВЕРЬТЕ СЕРТОВ

conn = boto.connect_dynamodb(
    aws_access_key_id = ' ',
    aws_secret_access_key = ' ', 
    is_secure = True, 
    validate_certs = False)

"validate_certs = False" имеет решающее значение

Если кто-то узнает, как исправить ошибку при проверке сертификата, ответьте!

1 голос
/ 08 октября 2010

Я действительно заставил это работать.Ответ заключался в том, чтобы бросить boto и использовать вместо этого библиотеку плакатов.Я все еще использую boto для генерации подписанной политики и необходимых полей формы для POST, который я делаю через poster, но фактический исполняемый файл, который выполняет POST, теперь включает только poster.С просто плакатом в миксе у py2exe нет проблем с созданием отдельного исполняемого файла для меня для распространения.

...