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

¿Fue útil?

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"]}})

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,
    )
scroll top