115 lines
3.2 KiB
Markdown
115 lines
3.2 KiB
Markdown
|
# VWED任务系统无窗口模式修复说明
|
|||
|
|
|||
|
## 问题描述
|
|||
|
在打包后的exe文件运行时,出现以下错误:
|
|||
|
```
|
|||
|
AttributeError: 'NoneType' object has no attribute 'isatty'
|
|||
|
ValueError: Unable to configure formatter 'default'
|
|||
|
```
|
|||
|
|
|||
|
## 问题原因
|
|||
|
1. 在无窗口模式(console=False)下,Python的标准输入输出流(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
|
|||
|
```
|
|||
|
|
|||
|
这将生成完整的发布包,包含所有必要的启动脚本和工具。
|