使用auto_py_to_exe打包Python Eel应用生成可执行文件后运行报错求助
解决Eel应用PyInstaller打包后运行出现
'NoneType' object has no attribute 'write'错误 错误原因
使用--windowed参数打包时,Python的sys.stdout和sys.stderr会被设置为None,而Eel依赖的Bottle库在导入阶段会尝试向标准输出写入内容,从而触发该属性错误。
解决方案
1. 修改main.py代码
在导入eel之前,先重定向标准输出和错误流到空对象,避免Bottle写入失败,同时适配PyInstaller打包后的资源路径:
import sys import os # 处理windowed模式下stdout/stderr为None的问题 class NullStream: def write(self, msg): pass if sys.stdout is None: sys.stdout = NullStream() if sys.stderr is None: sys.stderr = NullStream() # 之后再导入eel import eel # 获取打包后的资源路径(适配PyInstaller临时目录) def get_resource_path(relative_path): try: base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 初始化eel时使用正确的资源路径 eel.init(get_resource_path('web')) eel.start('main.html', size=(800, 600))
2. 调整PyInstaller打包命令
确保--add-data参数格式正确(Windows用;分隔路径),同时显式声明隐藏依赖:
pyinstaller --noconfirm --onedir --windowed --add-data "web;web" --hidden-import eel --hidden-import bottle main.py
如果用auto_py_to_exe操作,在「Additional Files」中添加web文件夹,目标路径设为web;在「Hidden Imports」中添加eel和bottle。
3. 验证打包结果
打包完成后进入dist/main目录(onedir模式),运行main.exe,即可正常启动应用窗口,不再触发原错误。
内容的提问来源于stack exchange,提问作者crybaby
相关产品推荐
相关产品推荐

