【问题标题】:CX_FREEZE Window - AttributeError: 'NoneType' object has no attribute writeCX_FREEZE 窗口 - AttributeError:“NoneType”对象没有属性写入
【发布时间】:2020-09-18 13:09:59
【问题描述】:

我目前正在使用 cx_freeze 6.1(6.2 和 6.3 有一些不同的问题)为 OpenCV python 应用程序生成 MSI windows 安装程序。编译成功并生成 MSI 安装程序。 当 base 设置为“None”或“Console”时,安装程​​序工作正常。但是,它会为 base = "Win32GUI" 引发错误。 我将基础设置为 Win32GUI,因为我不希望用户看到提示窗口或让他们意外关闭应用程序。 请参阅附件以查看完整的错误。我尝试了其他帖子中提到的一些旧解决方案,但没有任何帮助。我尝试在排除项中包含“点击”,它也没有帮助。感谢任何相关的回复。

Error in Windows GUI

【问题讨论】:

    标签: windows-installer cx-freeze


    【解决方案1】:

    经过两天的奋斗,我找到了自己的答案。分享,以便可以帮助他人。 base="Win32GUI" - 尝试将所有 strerr 和 stdout 消息写入 Windows GUI。但是,由于内存有限,它在大多数情况下都会失败,因为它会尝试将这些错误重定向到某个文件。

    最佳方法如下:

    将所有 stderr 和 stdout 消息重定向到任何文件,例如日志文件。我按照以下说明操作:How to redirect stdout and stderr to logger in Python 并创建了记录器编写器:

    import sys
    
    class LoggerWriter:
    def __init__(self, level):
        # self.level is really like using log.debug(message)
        # at least in my case
        self.level = level
    
    def write(self, message):
        # if statement reduces the amount of newlines that are
        # printed to the logger
        if message != '\n':
            self.level(message)
    
    def flush(self):
        # create a flush method so things can be flushed when
        # the system wants to. Not sure if simply 'printing'
        # sys.stderr is the correct way to do it, but it seemed
        # to work properly for me.
        self.level(sys.stderr)
    

    然后在 app.py 或您的主烧瓶文件中,创建日志和/或错误文件。下面的示例创建 error.log

    import configparser
    import logging
    import sys
    from LoggerWriter import LoggerWriter
    from pathlib import Path
    from logging.handlers import TimedRotatingFileHandler
    from threading import Timer
    
    # Create Logger if doesn't exist
    Path("log").mkdir(parents=True, exist_ok=True)
    formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
    handler = TimedRotatingFileHandler('log/error.log', when="midnight", 
    interval=1, encoding='utf8')
    handler.suffix = "%Y-%m-%d"
    handler.setFormatter(formatter)
    logger = logging.getLogger()
    logger.setLevel(logging.ERROR)
    logger.addHandler(handler)
    sys.stdout = LoggerWriter(logging.debug)
    sys.stderr = LoggerWriter(logging.warning)
    
    if __name__ == '__main__':
       app.run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2020-09-15
      • 2019-01-01
      相关资源
      最近更新 更多