Pergunta

py2exe não funciona com o módulo de e-mail padrão

Olá. Eu estou tentando usar py2exe para converter um script em um exe. O processo de compilação mostra isso:


Os seguintes módulos parecem estar faltando

[ 'email.Encoders', 'email.Generator', 'email.Iterators', 'email.MIMEBase', 'email.MIMEMultipart', 'email.MIMEText', 'email.Utils', 'email.base64MIME ']

O executável não funciona. Os módulos referenciados não estão incluídos. Eu pesquisei isso na internet e descobri que py2exe tem um problema com a importação preguiçoso utilizada no módulo lib e-mail padrão. Infelizmente eu não obtiveram êxito em encontrar uma solução para este problema. Alguém pode ajudar?

Obrigado,

P.S. As importações no olhar de script como este:

Código: import string, tempo, sys, os, smtplib de email.MIMEMultipart importação MimeMultipart de MIMEBase importação email.MIMEBase de MimeText importação email.MIMEText de Codificadores e-mail de importação

Foi útil?

Solução

Se você não tem que trabalhar com py2exe, bbfreeze funciona melhor, e eu tentei com o módulo de e-mail. http://pypi.python.org/pypi/bbfreeze/0.95.4

Outras dicas

Tenha um olhar para esta questão how-to-pacote-twisted-programa -com-py2exe parece ser o mesmo problema.

A resposta dada não é incluir explicitamente os módulos da linha de comando para py2exe.

Qual versão do Python você está usando? Se você estiver usando 2.5 ou 2.6, então você deve estar fazendo sua importação 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

Estou bastante certo de que modulefinder de py2exe pode encontrar corretamente o pacote de e-mail, se você usá-lo corretamente (ou seja, usar os nomes acima em Python 2.5+, ou usar os nomes antigos em Python 2.4-). Certamente, o script de instalação SpamBayes não precisa incluir explicitamente o pacote de e-mail, e inclui os módulos de e-mail, sem problema.

As outras respostas está correto em que se você fizer necessidade de incluir especificamente um módulo, você usa o "inclui" opção, quer através da linha de comando, ou passá-los em quando você chamar de configuração.

Eu tenho que trabalhar, incluindo explicitamente os módulos que faltam no setup.py:

setup.py VELHO:

setup(console = ['main.py'])

New setup.py:

setup(console = ['main.py'], 
      options={"py2exe":{"includes":["email.mime.multipart","email.mime.text"]}})

enquanto portar meu aplicativo de py24 a 26 eu tive o mesmo problema.

Depois de ler http://www.py2exe.org/index.cgi/ExeWithEggs se for encontrado finalmente seguinte solução:

na minha 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

em 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 py2exe para trabalhar com pacotes carregados durante a execução, o mais importante parece ser que u explicitamente importar os módulos necessários para o seu lugar aplicativo em seu aplicativo. E depois dar py2exe no setup.py com moudlefinder.AddPackagePath (,) a dica, onde procurar módulos que ele não poderia encontrar por std. introspecção. no aplicativo

Esta resolver o meu problema: na edição setup.py

includes = ["email"]

Por favor, tente isso. Isso funciona em meu construir py2exe. Basta substituir "project_name.py" com o seu script principal. Os EXTRA_INCLUDES são pacotes que você precisa incluir em sua construção como pacote de e-mail. I isso funciona com você também.

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,
    )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top