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

115 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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()`方法:
```python
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配置
```python
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. 启动脚本优化
前台启动脚本优先使用调试版本,确保用户能看到详细信息:
```batch
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`
- 支持优雅关闭和强制停止
- 进程状态检查和资源监控
## 验证方法
运行测试脚本验证修复效果:
```bash
python packaging/test_headless.py
```
## 构建命令
```bash
cd packaging/scripts
build_integrated.bat
```
这将生成完整的发布包,包含所有必要的启动脚本和工具。