Python: Py2exe no puede compilar .exe usando el módulo 'correo electrónico'
Pregunta
py2exe no funciona con el módulo de correo electrónico estándar
Hola. Estoy tratando de usar py2exe para convertir un script en un exe. El proceso de construcción muestra esto:
Parece que faltan los siguientes módulos
['email.Encoders', 'email.Generator', 'email.Iterators', 'email.MIMEBase', 'email.MIMEMultipart', 'email.MIMEText', 'email.Utils', 'email.base64MIME ']
El ejecutable no funciona. Los módulos referenciados no están incluidos. Investigué esto en Internet y descubrí que py2exe tiene un problema con la importación perezosa utilizada en el módulo de correo electrónico estándar lib. Desafortunadamente, no he logrado encontrar una solución para este problema. ¿Alguien puede ayudar?
Gracias,
P.S. Las importaciones en el script se ven así:
Código: Seleccionar todo Importar cadena, tiempo, sys, os, smtplib desde email.MIMEMultipart importar MIMEMultipart desde email.MIMEBase import MIMEBase desde email.MIMEText importar MIMEText desde los codificadores de importación de correo electrónico
Solución
Si no tiene que trabajar con py2exe, bbfreeze funciona mejor y lo he intentado con el módulo de correo electrónico. http://pypi.python.org/pypi/bbfreeze/0.95.4
Otros consejos
Echa un vistazo a esta pregunta how-to-package-twisted-program -with-py2exe parece ser el mismo problema.
La respuesta dada es incluir explícitamente los módulos en la línea de comandos a py2exe.
¿Qué versión de Python estás usando? Si está usando 2.5 o 2.6, entonces debería hacer su importación como:
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
Estoy bastante seguro de que el modulefinder de py2exe puede encontrar correctamente el paquete de correo electrónico si lo usas correctamente (es decir, usa los nombres anteriores en Python 2.5+, o usa los nombres antiguos en Python 2.4-). Ciertamente, el script de configuración de SpamBayes no necesita incluir explícitamente el paquete de correo electrónico, e incluye los módulos de correo electrónico sin problemas.
Las otras respuestas son correctas en el sentido de que si necesita incluir un módulo específicamente, use el " incluye " opción, ya sea a través de la línea de comandos, o pasándolos cuando llame a la instalación.
Usar el " incluye " opción. Consulte: http://www.py2exe.org/index.cgi/ListOfOptions
Lo conseguí trabajando al incluir explícitamente módulos faltantes en setup.py:
Setup.py ANTIGUO:
setup(console = ['main.py'])
Nuevo archivo setup.py:
setup(console = ['main.py'],
options={"py2exe":{"includes":["email.mime.multipart","email.mime.text"]}})
mientras portaba mi aplicación de py24 a 26 tuve el mismo problema.
Después de leer http://www.py2exe.org/index.cgi/ExeWithEggs Si finalmente se encuentra la siguiente solución:
en mi aplicación.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
en 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")
Para que py2exe funcione con paquetes cargados durante el tiempo de ejecución, lo principal es que importas explícitamente los módulos que necesita tu aplicación en algún lugar de tu aplicación. Y luego dé a py2exe en setup.py con moudlefinder.AddPackagePath (,) la sugerencia, donde buscar módulos que no pudo encontrar por std. introspección. en la aplicación
Esto resuelve mi problema: en setup.py edit
includes = ["email"]
Por favor, intente esto. Esto funciona en mi compilación py2exe. Simplemente reemplaza " nombre_proyecto.py " con su guión principal. Los EXTRA_INCLUDES son paquetes que debe incluir en su compilación como el paquete de correo electrónico. Esto también funciona contigo.
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,
)