Python-Py2exeは 'email'モジュールを使用して.exeをビルドできません
質問
py2exeは標準の電子メールモジュールでは動作しません
こんにちは。スクリプトをexeに変換するためにpy2exeを使用しようとしています。ビルドプロセスはこれを示しています:
次のモジュールが欠落しているようです
['email.Encoders'、 'email.Generator'、 'email.Iterators'、 'email.MIMEBase'、 'email.MIMEMultipart'、 'email.MIMEText'、 'email.Utils'、 'email.base64MIME ']
実行可能ファイルは機能しません。参照モジュールは含まれていません。これをインターネットで調査したところ、py2exeには標準のlibメールモジュールで使用されるレイジーインポートに問題があることがわかりました。残念ながら、この問題の回避策を見つけることに成功していません。誰でも助けることができますか?
ありがとうございます
PS スクリプトのインポートは次のようになります。
コード:すべて選択 インポート文字列、時間、sys、os、smtplib email.MIMEMultipartからMIMEMultipartをインポート email.MIMEBaseからMIMEBaseをインポート email.MIMETextからMIMETextをインポート メールインポートエンコーダーから
解決
py2exeを使用する必要がない場合は、bbfreezeの方がうまく機能します。メールモジュールで試してみました。 http://pypi.python.org/pypi/bbfreeze/0.95.4
他のヒント
この質問をご覧ください how-to-package-twisted-program -with-py2exe は同じ問題のようです。
そこに与えられた答えは、py2exeのコマンドラインにモジュールを明示的に含めることです。
使用しているPythonのバージョンは何ですか? 2.5または2.6を使用している場合は、次のようにインポートする必要があります。
import string,time,sys,os,smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import Encoders
py2exeのモジュールファインダーは、正しく使用した場合(つまり、Python 2.5以降で上記の名前を使用するか、Python 2.4-で古い名前を使用した場合)、電子メールパッケージを正しく見つけることができると確信しています。確かに、SpamBayesセットアップスクリプトにはメールパッケージを明示的に含める必要はなく、メールモジュールは問題なく含まれています。
他の答えは正しいです。モジュールを具体的に含める必要がある場合は、" includes"を使用します。コマンドラインを介して、またはセットアップを呼び出すときにそれらを渡すオプションのいずれか。
" includes"を使用しますオプション。参照: http://www.py2exe.org/index.cgi/ListOfOptions
setup.pyに不足しているモジュールを明示的に含めることで機能しました:
OLD setup.py:
setup(console = ['main.py'])
新しいsetup.py:
setup(console = ['main.py'],
options={"py2exe":{"includes":["email.mime.multipart","email.mime.text"]}})
py24から26にアプリを移植しているときに同じ問題が発生しました。
http://www.py2exe.org/index.cgi/ExeWithEggsを読んだ後a> 最後に解決策が見つかった場合:
application.py内:
import email
import email.mime.text
import email.mime.base
import email.mime.multipart
import email.iterators
import email.generator
import email.utils
try:
from email.MIMEText import MIMEText
except:
from email.mime import text as MIMEText
setup.pyで:
import modulefinder
modulefinder.AddPackagePath("mail.mime", "base")
modulefinder.AddPackagePath("mail.mime", "multipart")
modulefinder.AddPackagePath("mail.mime", "nonmultipart")
modulefinder.AddPackagePath("mail.mime", "audio")
modulefinder.AddPackagePath("mail.mime", "image")
modulefinder.AddPackagePath("mail.mime", "message")
modulefinder.AddPackagePath("mail.mime", "application")
py2exeが実行時にロードされたパッケージを操作するための主なことは、アプリのどこかでアプリに必要なモジュールを明示的にインポートすることです。 そして、moudlefinder.AddPackagePath(、)でsetup.pyのpy2exeにヒントを与えます。これは、stdで見つけることができなかったモジュールを検索する場所です。内省。 アプリ内
これは私の問題を解決します: setup.py edit
でincludes = ["email"]
これを試してください。これは私のpy2exeビルドで動作します。 " project_name.py"を置き換えるだけですメインスクリプトで。 EXTRA_INCLUDESは、メールパッケージのようなビルドに含める必要があるパッケージです。私もあなたと一緒に動作します。
from distutils.core import setup
import py2exe, sys, os
sys.argv.append('py2exe')
EXTRA_INCLUDES = [
"email.iterators", "email.generator", "email.utils", "email.base64mime", "email", "email.mime",
"email.mime.multipart", "email.mime.text", "email.mime.base",
"lxml.etree", "lxml._elementpath", "gzip"
]
setup(
options = {'py2exe': {'bundle_files': 1, 'compressed': True, 'includes': EXTRA_INCLUDES,
'dll_excludes': ['w9xpopen.exe','MSVCR71.dll']}},
console = [{'script': "project_name.py"}],
zipfile = None,
)