我目前正在使用 cx_freeze 6.1(6.2 和 6.3 存在一些不同的问题)为 OpenCV python 应用程序生成 MSI Windows 安装程序。编译成功并生成MSI安装程序。 当基础设置为“无”或“控制台”时,安装程序可以正常工作。但是,它会引发 base =“Win32GUI”的错误。 我将基础设置为 Win32GUI,因为我不希望用户看到提示窗口或允许他们意外关闭应用程序。 请参阅附件以查看完整的错误。我尝试了其他帖子中提到的一些旧解决方案,但没有任何帮助。我尝试在排除中包含“点击”,但也没有帮助。感谢任何相关回复。
经过两天的奋斗,我找到了自己的答案。分享,这样可以帮助别人。 base="Win32GUI" - 这尝试将所有 strerr 和 stdout 消息写入 Windows GUI。然而,由于内存有限,大多数时候它都会失败,因为它会尝试将这些错误重定向到某个文件。
最好的方法如下:
将所有 stderr 和 stdout 消息重定向到任何文件,例如日志档案。我按照以下说明进行操作:如何将 stdout 和 stderr 重定向到 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 或主 Flask 文件中,创建日志和/或错误文件。下面的示例创建 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()