Skip to content

Repository files navigation

终端输出捕获工具

当程序已经在运行且输出直接到终端时,传统方法无法事后捕获输出(详见 00bak/README.md)。本工具使用 OCR(光学字符识别) 技术,通过持续截图和文字识别来捕获终端输出。

项目结构

.
├── terminal_ocr_capture.py  # OCR捕获主程序
├── select_region.py         # 交互式区域选择工具
├── test_printer.py          # 测试脚本(持续打印)
├── requirements.txt         # Python依赖
├── README.md               # 本文件
└── 00bak/                  # 旧方法测试记录(传统方法均不可行)
    ├── README.md           # 详细测试记录
    └── continuous_print.py # 旧版测试脚本

快速开始

1. 安装依赖

# 安装Python库
pip install -r requirements.txt

# 安装系统级OCR引擎
sudo apt-get install tesseract-ocr

# 安装中文语言包(如果需要识别中文)
sudo apt-get install tesseract-ocr-chi-sim

# 或者安装所有语言包
sudo apt-get install tesseract-ocr-all

注意:如果只识别英文,可以跳过中文语言包的安装,并在运行时使用 -l eng 参数。

2. 运行测试程序

在一个终端窗口中运行测试脚本(模拟正在运行的程序):

python test_printer.py

3. 启动OCR捕获

在另一个终端窗口中运行OCR捕获工具:

方法A:全屏捕获

python terminal_ocr_capture.py -o captured_output.txt

方法B:选择特定区域(推荐)

  1. 先运行区域选择工具:
python select_region.py
  1. 全屏会变暗,点击并拖拽选择终端窗口区域

  2. 按 Enter 确认,工具会输出完整命令,直接复制运行即可

方法C:手动指定区域

python terminal_ocr_capture.py -o captured_output.txt -r 100 100 800 600
# 参数:左上角X坐标 Y坐标 宽度 高度

指定语言(如果只识别英文)

python terminal_ocr_capture.py -o captured_output.txt -l eng

4. 查看结果

捕获的文本会实时保存到指定文件(如 captured_output.txt)。按 Ctrl+C 停止捕获。

详细使用说明

terminal_ocr_capture.py

主程序,持续截图并识别文字。

参数:

  • -o, --output: 输出文件路径(必需)
  • -i, --interval: 截图间隔(秒),默认 0.5
  • -r, --region: 截图区域 X Y WIDTH HEIGHT(可选)
  • -m, --monitor: 显示器索引,默认 1
  • -l, --lang: OCR语言,默认 chi_sim+eng(简体中文+英文)。可选:eng(仅英文)、chi_sim(仅简体中文)

示例:

# 全屏捕获,间隔1秒
python terminal_ocr_capture.py -o output.txt -i 1.0

# 捕获指定区域
python terminal_ocr_capture.py -o output.txt -r 0 0 1920 1080

select_region.py

交互式区域选择工具,帮助确定终端窗口的坐标。

使用方法:

  1. 运行 python select_region.py
  2. 全屏会变暗,显示红色十字光标
  3. 点击并拖拽选择终端窗口区域
  4. 按 Enter 确认,或按 Esc 取消
  5. 工具会输出完整的运行命令

test_printer.py

测试脚本,模拟正在运行的程序,持续打印时间戳。

特点:

  • 多线程并发打印
  • 不同线程使用不同延迟
  • 适合测试OCR捕获功能

运行:

python test_printer.py
# 按 Ctrl+C 停止

工作原理

  1. 截图:按设定间隔捕获屏幕或指定区域
  2. OCR识别:使用 Tesseract OCR 引擎识别文字
  3. 去重:与已保存文本对比,只保存新出现的行
  4. 保存:实时追加到输出文件

注意事项

最佳实践

  1. 终端设置

    • 使用清晰的等宽字体(如 Consolas, Monaco, DejaVu Sans Mono)
    • 增大字体大小(至少 14pt,推荐 16-18pt)
    • 使用高对比度配色(如黑底白字或白底黑字)
    • 避免使用彩色文本(单色文本识别率更高)
  2. 图像预处理优化

    • 程序已自动进行图像预处理:灰度化、放大2倍、增强对比度、二值化
    • 这些处理有助于提高OCR识别率,特别是对中文文本
  3. 捕获设置

    • 间隔建议 0.5-1.0 秒
    • 太短:可能重复识别,增加CPU负担
    • 太长:可能漏掉快速滚动的文本
  4. 区域选择

    • 尽量精确选择终端窗口区域
    • 避免包含其他窗口或UI元素
    • 如果终端全屏,可以直接全屏捕获

限制

  • OCR 识别率受字体、大小、对比度影响
  • 彩色文本可能影响识别(建议使用单色)
  • 特殊字符(如表格边框)可能识别不准确
  • 需要一定的CPU资源进行OCR处理

与旧方法对比

在 00bak/README.md 中记录了传统方法的测试结果:

  • ❌ 读取 /dev/pts/N - 只能读键盘输入,无法读程序输出
  • ❌ 读取 /proc/<pid>/fd/1 - 已连接终端的文件描述符无法被其他进程读取
  • ❌ 使用 strace - 需要 root 权限,且可能影响性能
  • ✅ 使用 tee/script/tmux - 有效,但需要提前准备

OCR方法的优势:

  • ✅ 不需要提前准备
  • ✅ 不需要 root 权限
  • ✅ 不需要修改运行中的程序
  • ✅ 适用于任何已运行的程序

OCR方法的劣势:

  • ⚠️ 需要一定的CPU资源
  • ⚠️ 识别率受显示质量影响
  • ⚠️ 无法捕获已滚出屏幕的历史内容

故障排除

OCR识别率低

  1. 检查终端字体和大小
  2. 确保高对比度(黑底白字最佳)
  3. 尝试调整截图间隔
  4. 检查选择的区域是否准确

程序无法启动

  1. 确认已安装 tesseract-ocr:tesseract --version
  2. 确认Python依赖已安装:pip list | grep pytesseract
  3. 检查是否有GUI权限(区域选择工具需要)

捕获不到新内容

  1. 确认测试程序正在运行
  2. 检查选择的区域是否正确
  3. 尝试降低截图间隔
  4. 查看程序输出的状态信息

许可证

本项目仅供学习和研究使用。

About

python program for capturing running terminal, especially if the terminal cannot record all i/o

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages