Python — Py2exe не может создать .exe с помощью модуля «электронная почта»

py2exe не работает со стандартным модулем электронной почты

Привет. Я пытаюсь использовать py2exe для преобразования скрипта в exe. Процесс сборки показывает следующее:


Следующие модули отсутствуют

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

Исполняемый файл не работает. Упомянутые модули не включены. Я исследовал это в Интернете и обнаружил, что у py2exe есть проблема с ленивым импортом, используемым в стандартном модуле электронной почты lib. К сожалению, мне не удалось найти обходной путь для этой проблемы. Кто-нибудь может помочь?

Спасибо,

P.S. Импорт в скрипте выглядит так:

Код: выберите всю строку импорта, время, sys, os, smtplib из электронной почты. MIMEMultipart импортирует MIMEMultipart из электронной почты. MIMEBase импортирует MIMEBase из электронной почты.


person jideel    schedule 06.10.2008    source источник


Ответы (8)


Если вам не нужно работать с py2exe, bbfreeze работает лучше, и я пробовал его с модулем электронной почты. http://pypi.python.org/pypi/bbfreeze/0.95.4

person Vasil    schedule 06.10.2008
comment
Спасибо за ссылку - я использовал py2exe ранее, но должен попробовать! - person Jon Cage; 06.10.2008

Посмотрите на этот вопрос how-to-package-twisted-program-with- py2exe похоже, та же проблема.

Ответ, данный там, заключается в том, чтобы явно включить модули в командной строке для py2exe.

person David Dibben    schedule 06.10.2008

Какую версию Python вы используете? Если вы используете 2.5 или 2.6, вы должны выполнять импорт следующим образом:

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

Я почти уверен, что модуль поиска py2exe может правильно найти пакет электронной почты, если вы используете его правильно (т.е. используете приведенные выше имена в Python 2.5+ или используете старые имена в Python 2.4-). Конечно, скрипту установки SpamBayes не нужно явно включать пакет электронной почты, и он без проблем включает модули электронной почты.

Другие ответы верны в том смысле, что если вам нужно специально включить модуль, вы используете параметр «включает» либо через командную строку, либо передаете их при вызове установки.

person Tony Meyer    schedule 06.10.2008
comment
Что можно добавить из email.Utils import formatdate. Я сталкиваюсь с проблемами при создании exe. Отсутствуют модули email.Utils - person Rao; 27.06.2014

Используйте вариант «включает». См.: http://www.py2exe.org/index.cgi/ListOfOptions.

person Jeremy Brown    schedule 06.10.2008
comment
Я пробовал, меньше ошибок, но все равно выводит: Следующие модули отсутствуют ['email.Encoders', 'email.Generator', 'email.Iterators', 'email.MIMEBase', 'email.MIMEMultipart', 'email .MIMEText», «email.Utils», «email.base64MIME»]. bb-freeze проще в настройке и работает «из коробки». - person jideel; 06.10.2008

Я заработал, явно включив отсутствующие модули в setup.py:

СТАРЫЙ setup.py:

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

Новый setup.py:

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

при переносе моего приложения с py24 на 26 у меня была такая же проблема.

После прочтения http://www.py2exe.org/index.cgi/ExeWithEggs, если наконец нашел следующее решение:

в моем приложении.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

в 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")

Чтобы py2exe работал с пакетами, загруженными во время выполнения, главное, чтобы вы явно импортировали модули, необходимые вашему приложению, где-то в вашем приложении. А затем дайте py2exe в setup.py с помощью moudlefinder.AddPackagePath( , ) подсказку, где искать модули, которые он не смог найти с помощью std. самоанализ. в приложении

person AdrianB    schedule 28.07.2009

Это решает мою проблему: в setup.py редактировать

includes = ["email"]
person Community    schedule 03.09.2013

Пожалуйста, попробуйте это. Это работает на моей сборке py2exe. Просто замените «project_name.py» своим основным скриптом. EXTRA_INCLUDES — это пакеты, которые необходимо включить в сборку, например пакет электронной почты. Я это работает и с вами.

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,
    )
person Arbin Bulaybulay    schedule 20.09.2014
comment
Работает для меня, что является облегчением, так как я никогда не заставлял bb-freeze работать вообще. - person Prof. Falken; 30.08.2015