1

boto パッケージを使用してファイルを S3 バケットにアップロードし、単一の再配布可能な .exe ファイルにする単純な Python プログラムをコンパイルしようとしています。私はどんなコンパイル方法にもオープンです。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

Windows XP SP3 で ActiveState Python 2.6 を使用しています。boto パッケージは次のようにインストールされました。

easy_installer --always-unzip boto

解凍された卵ファイルに問題があることについて、ここ--always-unzipある情報に基づいてオプションを使用しました。残念ながら、実行可能ファイルのビルドに使用した場合と同じエラーが発生します。py2exebb-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がモジュールが見つからないというエラーで失敗したりすることはありませんでした。

このコードを再配布用にバンドルするのを手伝ってくれる人はいますか?

4

3 に答える 3

1

これは古い質問であることは知っていますが、同じ問題があり、py2exe と py2app を使用している間に修正しました。setup.py で「includes」オプションの代わりに「packages」オプションを使用してください。

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
)   

それが役立つことを願っています。

于 2012-02-11T18:19:08.553 に答える
1

私は実際にこれを機能させました。答えは、boto を捨てて、代わりに poster ライブラリを使用することでした。私は今でも boto を使用して、署名されたポリシーと、poster を介して行う POST に必要なフォーム フィールドを生成していますが、POST を実行する実際の実行可能ファイルには、現在 poster のみが含まれています。ポスターだけが混在しているため、py2exe は、再配布用にスタンドアロンの実行可能ファイルを作成する際に問題はありません。

于 2010-10-08T00:12:21.997 に答える
1

boto & py2exe で動作するexeを作成できました

script.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」は重要です

誰かが証明書の検証でエラーを修正する方法を見つけたら、返信してください!

于 2012-11-12T23:00:55.003 に答える