8

py2exe 不适用于标准电子邮件模块

你好。我正在尝试使用 py2exe 将脚本转换为 exe。构建过程显示了这一点:


似乎缺少以下模块

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

可执行文件不起作用。不包括引用的模块。我在网上对此进行了研究,我发现 py2exe 在标准 lib 电子邮件模块中使用的 Lazy import 存在问题。不幸的是,我没有成功找到解决此问题的方法。任何人都可以帮忙吗?

谢谢,

脚本中的 PS Imports 如下所示:

代码:select all import string,time,sys,os,smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email import Encoders

4

8 回答 8

4

看看这个问题how-to-package-twisted-program-with-py2exe它似乎是同样的问题。

给出的答案是将命令行上的模块显式包含到 py2exe。

于 2008-10-06T13:05:01.487 回答
4

你使用的是什么版本的 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 的modulefinder 可以正确找到电子邮件包(即在Python 2.5+ 中使用上述名称,或在Python 2.4- 中使用旧名称)。当然,SpamBayes 安装脚本不需要显式包含电子邮件包,它包含电子邮件模块没有问题。

其他答案是正确的,因为如果您确实需要专门包含一个模块,则可以通过命令行使用“includes”选项,或者在调用 setup.xml 时将它们传入。

于 2008-10-06T21:38:17.923 回答
2

使用“包含”选项。见: http: //www.py2exe.org/index.cgi/ListOfOptions

于 2008-10-06T15:31:13.627 回答
1

如果您不必使用 py2exe,bbfreeze 效果更好,我已经尝试使用电子邮件模块。http://pypi.python.org/pypi/bbfreeze/0.95.4

于 2008-10-06T13:09:26.687 回答
1

我通过在 setup.py 中明确包含缺少的模块来使其工作:

旧的 setup.py:

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

新的 setup.py:

setup(console = ['main.py'], 
      options={"py2exe":{"includes":["email.mime.multipart","email.mime.text"]}})
于 2015-07-23T21:52:10.183 回答
0

在将我的应用程序从 py24 移植到 26 时,我遇到了同样的问题。

阅读http://www.py2exe.org/index.cgi/ExeWithEggs后 ,如果最终找到以下解决方案:

在我的 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

在 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 处理在运行时加载的包,主要的事情似乎是你在你的应用程序的某个地方显式地导入你的应用程序所需的模块。然后用 moudlefinder.AddPackagePath( , ) 给 setup.py 中的 py2exe 提示,在哪里搜索标准找不到的模块。内省。在应用程序中

于 2009-07-28T14:56:32.663 回答
0

这解决了我的问题:在 setup.py 中编辑

includes = ["email"]
于 2013-09-03T22:16:01.253 回答
0

请试试这个。这适用于我的 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,
    )
于 2014-09-20T09:20:36.467 回答