【问题标题】:Python - Py2exe can't build .exe using the 'email' modulePython - Py2exe 无法使用“电子邮件”模块构建 .exe
【发布时间】:2010-09-15 12:11:15
【问题描述】:

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

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


似乎缺少以下模块

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

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

谢谢,

附: 脚本中的导入如下所示:

代码:全选 导入字符串、时间、系统、操作系统、smtplib 从 email.MIMEMultipart 导入 MIMEMultipart 从 email.MIMEBase 导入 MIMEBase 从 email.MIMEText 导入 MIMEText 从电子邮件导入编码器

【问题讨论】:

    标签: python winapi py2exe


    【解决方案1】:

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

    旧的 setup.py:

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

    新的 setup.py:

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

    【讨论】:

      【解决方案2】:

      请试试这个。这适用于我的 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,
          )
      

      【讨论】:

      • 为我工作,这是一种解脱,因为我根本没有 bb-freeze 工作。
      【解决方案3】:

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

      includes = ["email"]
      

      【讨论】:

        【解决方案4】:

        在将我的应用程序从 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 提示,在哪里搜索 std 找不到的模块。内省。 在应用程序中

        【讨论】:

          【解决方案5】:

          您使用的是哪个版本的 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 设置脚本不需要显式包含电子邮件包,它包含电子邮件模块没有问题。

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

          【讨论】:

          • 从“email.Utils import formatdate”添加的替代方法是什么。我在创建 exe 时遇到了这方面的问题。缺少模块 email.Utils
          【解决方案6】:

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

          【讨论】:

          • 我试过了,错误更少,但仍然输出:以下模块似乎缺少 ['email.Encoders', 'email.Generator', 'email.Iterators', 'email.MIMEBase', 'email.MIMEMultipart'、'email.MIMEText'、'email.Utils'、'email.base64MIME']。 bb-freeze 更易于设置和“开箱即用”。
          【解决方案7】:

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

          【讨论】:

          • 为链接干杯 - 我以前一直在使用 py2exe,但必须尝试一下!
          【解决方案8】:

          看看这个问题how-to-package-twisted-program-with-py2exe好像是同一个问题。

          那里给出的答案是明确将命令行中的模块包含在 py2exe 中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-15
            • 1970-01-01
            • 2017-09-01
            • 1970-01-01
            • 2016-06-21
            • 1970-01-01
            • 1970-01-01
            • 2010-12-18
            相关资源
            最近更新 更多