VWED_server/packaging/HEADLESS_MODE_FIX.md
2025-09-09 10:41:27 +08:00

3.2 KiB
Raw Blame History

VWED任务系统无窗口模式修复说明

问题描述

在打包后的exe文件运行时出现以下错误

AttributeError: 'NoneType' object has no attribute 'isatty'
ValueError: Unable to configure formatter 'default'

问题原因

  1. 在无窗口模式console=FalsePython的标准输入输出流stdout/stderr/stdin可能为None
  2. uvicorn的默认日志配置器尝试访问这些流的isatty()方法导致AttributeError
  3. 这进一步导致日志配置失败

修复方案

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. 分层错误处理

添加了多层级的错误处理机制:

  1. 正常配置启动
  2. 如果失败,尝试简化配置
  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监控服务状态

故障排除

  1. 如果后台启动失败,检查vwed_service.log文件
  2. 如果日志文件没有生成,尝试使用调试版本启动
  3. 确保config.ini配置文件正确
  4. 检查端口8000是否被占用

技术细节

PyInstaller配置

  • 主程序:console=False,支持后台运行
  • 调试版本:console=True,保留控制台窗口

日志系统

  • 无窗口模式:所有日志输出到文件
  • 前台模式:同时输出到控制台和文件
  • 使用自定义的日志处理器避免uvicorn格式化问题

进程管理

  • PID文件vwed_service.pid
  • 支持优雅关闭和强制停止
  • 进程状态检查和资源监控

验证方法

运行测试脚本验证修复效果:

python packaging/test_headless.py

构建命令

cd packaging/scripts
build_integrated.bat

这将生成完整的发布包,包含所有必要的启动脚本和工具。