Python - Py2exe non può creare .exe usando il modulo "email"
Domanda
py2exe non funziona con il modulo di posta elettronica standard
Ciao. Sto cercando di usare py2exe per convertire uno script in un exe. Il processo di compilazione mostra questo:
I seguenti moduli sembrano mancare
['email.Encoders', 'email.Generator', 'email.Iterators', 'email.MIMEBase', 'email.MIMEMultipart', 'email.MIMEText', 'email.Utils', 'email.base64MIME ']
L'eseguibile non funziona. I moduli di riferimento non sono inclusi. Ho studiato questo su Internet e ho scoperto che py2exe ha un problema con l'importazione Lazy utilizzata nel modulo di posta elettronica lib standard. Purtroppo non sono riuscito a trovare una soluzione per questo problema. Qualcuno può aiutare?
Grazie
P.S. Le importazioni nella sceneggiatura si presentano così:
Codice: selezionare tutto importa string, time, sys, os, smtplib da email.MIMEM multipart import MIMEMultipart da email.MIMEBase importa MIMEBase da email.MIMEText import MIMEText dagli encoder di importazione e-mail
Soluzione
Se non devi lavorare con py2exe, bbfreeze funziona meglio e l'ho provato con il modulo e-mail. http://pypi.python.org/pypi/bbfreeze/0.95.4
Altri suggerimenti
Dai un'occhiata a questa domanda how-to-package-twisted-program -with-py2exe sembra essere lo stesso problema.
La risposta fornita è quella di includere esplicitamente i moduli nella riga di comando in py2exe.
Quale versione di Python stai usando? Se stai usando 2.5 o 2.6, dovresti fare l'importazione come:
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
Sono abbastanza certo che il modulefinder di py2exe possa trovare correttamente il pacchetto e-mail se lo usi correttamente (cioè usa i nomi sopra in Python 2.5+ o usa i vecchi nomi in Python 2.4-). Certamente lo script di installazione di SpamBayes non deve includere esplicitamente il pacchetto e-mail e include i moduli e-mail senza problemi.
Le altre risposte sono corrette in quanto se è necessario includere in modo specifico un modulo, si utilizza la funzione "include" tramite la riga di comando o passandoli quando si chiama setup.
Utilizza " comprende " opzione. Vedi: http://www.py2exe.org/index.cgi/ListOfOptions
Ho funzionato includendo esplicitamente i moduli mancanti in setup.py:
OLD setup.py:
setup(console = ['main.py'])
Nuovo setup.py:
setup(console = ['main.py'],
options={"py2exe":{"includes":["email.mime.multipart","email.mime.text"]}})
durante il porting della mia app da py24 a 26 ho avuto lo stesso problema.
Dopo aver letto http://www.py2exe.org/index.cgi/ExeWithEggs se trovato alla fine seguente soluzione:
nel mio 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
in 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")
Affinché py2exe funzioni con i pacchetti caricati durante il runtime, la cosa principale sembra essere l'importazione esplicita dei moduli richiesti dalla tua app da qualche parte nella tua app. E poi dai a py2exe in setup.py con moudlefinder.AddPackagePath (,) il suggerimento, dove cercare i moduli che non ha trovato da std. introspezione. nell'app
Questo risolve il mio problema: in setup.py modifica
includes = ["email"]
Prova questo. Questo funziona sulla mia build py2exe. Sostituisci semplicemente " nome_progetto.py " con la tua sceneggiatura principale. EXTRA_INCLUDES sono pacchetti che devi includere nella tua build come pacchetto di posta elettronica. Io questo funziona anche con te.
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,
)