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

È stato utile?

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,
    )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top