سؤال

أحاول تجميع برنامج 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 ، يرجى الرد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top