Flask + Pyinstaller 打包后运行报错 SystemError

起因: 公司有个将Flask打包为exe且不显示终端窗口的需求.

过程: 先用Pyinstaller尝试打包, 不带 -w 参数, 打包、运行一切正常;

问题: 尝试添加 -w 参数后(隐藏终端窗口), 发现运行时报错SystemError.

分析: 跟踪异常堆栈发现, Flask的日志输出是通过写入标准输出实现的. 当终端窗口未被创建时, Flask会由于无法取得预期的标准输出实例(期望为: _io.TextIOWrapper)导致无法调用write方法的从而抛出SystemError 

解决: 在Flask初始化前显式的将标准输出重定向

import sys
import os

sys.stdout = open(os.devnull, "w")  # 不保留任何标准输出

# ------- 以下为原始代码 -------
app = Flask(__name__) # ...

最后: 请注意, 该做法会导致所有依赖于标准输出的函数(方法)失效, 这其中有可能包括日志. 因此最好在输出不多的情况下写到一个文件里或者输出多时定义一个类或方法封装一下.

原文地址:https://www.cnblogs.com/HoD7/p/15593620.html