كيفية تجميع رمز Python الذي يستخدم Boto للوصول إلى S3؟
سؤال
أحاول تجميع برنامج 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 XP SP3. تم تثبيت حزمة 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']
الذي يضفي بعض التلميحات. جربت الأساليب المقترحة في منشورات أخرى إلى ذلك حيث -i
تم التوصية بالخيار عند التجميع مع py2exe
وللأسف لا شيء ساعد. في تلك الأسئلة الأخرى ، كان المستخدمون يقومون بإدراجهم الصريح للوحدات الفرعية عبر البريد الإلكتروني. لم أستطع تحديد كيفية تكييف هذه الحلول مع حالتي للأسف وأضفها فقط -i
لم يتوقف py2exe
من تحذيري من الوحدات المفقودة ، أو EXE المجمعة الناتجة عن الفشل مع خطأ الوحدة النمطية المفقودة.
هل يمكن لأي شخص مساعدتي في الحصول على هذا الرمز لإعادة التوزيع؟
المحلول
لقد حصلت بالفعل على هذا للعمل. كان الجواب هو التخلص من بوتو واستخدام مكتبة الملصقات بدلاً من ذلك. ما زلت أستخدم BOTO لإنشاء سياسة موقعة وحقول النماذج اللازمة للنشر الذي أقوم به عبر الملصق ، ولكن القابل للتنفيذ الفعلي الذي لا يتضمن المنشور سوى الملصق الآن. من خلال ملصق فقط في هذا المزيج ، ليس لدى Py2exe أي مشاكل في إنشاء مستقل قابل للتنفيذ بالنسبة لي لإعادة التوزيع.
نصائح أخرى
أعلم أن هذا سؤال قديم ، لكنني واجهت نفس المشكلة وأصلحها بينما لا أزال أستخدم 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
)
امل ان يساعد.
لقد تمكنت من إنشاء Exe Working مع Boto & Py2exe
أضف إلى script.py
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
الخطأ التالي هو مع HTTPS Connection ، يبدو أن PY2EXE هو "إخفاء" ملف cert بطريقة أو بأخرى .. الطريقة لإصلاح هذا هي 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"
إذا اكتشف شخص ما كيفية إصلاح الخطأ في التحقق من صحة CERT ، يرجى الرد!