3.2 KiB
3.2 KiB
VWED任务系统无窗口模式修复说明
问题描述
在打包后的exe文件运行时,出现以下错误:
AttributeError: 'NoneType' object has no attribute 'isatty'
ValueError: Unable to configure formatter 'default'
问题原因
- 在无窗口模式(console=False)下,Python的标准输入输出流(stdout/stderr/stdin)可能为None
- uvicorn的默认日志配置器尝试访问这些流的isatty()方法,导致AttributeError
- 这进一步导致日志配置失败
修复方案
1. 标准流重定向
在IntegratedLauncher.__init__()
中添加了_setup_headless_mode()
方法:
def _setup_headless_mode(self):
"""设置无窗口模式的标准流重定向"""
try:
import io
null_file = io.StringIO()
# 重定向标准流到空文件,避免None对象引起的问题
if sys.stdout is None:
sys.stdout = null_file
if sys.stderr is None:
sys.stderr = null_file
if sys.stdin is None:
sys.stdin = io.StringIO("")
except Exception as e:
pass
2. Uvicorn日志配置优化
在无窗口模式下使用简化的uvicorn配置:
if self.headless:
# 无窗口模式:禁用reload、单worker、简化日志
uvicorn.run(
app, # 直接传递app对象而不是字符串
host="0.0.0.0",
port=port,
reload=False,
workers=1,
access_log=False, # 禁用访问日志避免格式化问题
log_config=None # 禁用默认日志配置
)
3. 分层错误处理
添加了多层级的错误处理机制:
- 正常配置启动
- 如果失败,尝试简化配置
- 最后尝试最基本的启动模式
4. 启动脚本优化
前台启动脚本优先使用调试版本,确保用户能看到详细信息:
if exist VWED_Task_System_Debug.exe (
echo 使用调试版本启动以便查看详细信息...
VWED_Task_System_Debug.exe
) else (
VWED_Task_System.exe
)
使用建议
开发和调试
- 使用
启动VWED任务系统.bat
,会优先使用调试版本 - 调试版本保留控制台窗口,便于查看错误信息
生产部署
- 使用
后台启动服务.bat
进行后台部署 - 日志记录在
vwed_service.log
文件中 - 使用
检查服务状态.bat
监控服务状态
故障排除
- 如果后台启动失败,检查
vwed_service.log
文件 - 如果日志文件没有生成,尝试使用调试版本启动
- 确保config.ini配置文件正确
- 检查端口8000是否被占用
技术细节
PyInstaller配置
- 主程序:
console=False
,支持后台运行 - 调试版本:
console=True
,保留控制台窗口
日志系统
- 无窗口模式:所有日志输出到文件
- 前台模式:同时输出到控制台和文件
- 使用自定义的日志处理器避免uvicorn格式化问题
进程管理
- PID文件:
vwed_service.pid
- 支持优雅关闭和强制停止
- 进程状态检查和资源监控
验证方法
运行测试脚本验证修复效果:
python packaging/test_headless.py
构建命令
cd packaging/scripts
build_integrated.bat
这将生成完整的发布包,包含所有必要的启动脚本和工具。