subprocess 如何捕获彩色 ANSI 输出并保留格式
发布时间 - 2026-01-21 00:00:00 点击率:次要捕获带颜色的ANSI输出,关键在于欺骗子进程使其认为运行在支持颜色的终端中:优先使用script -qec "cmd"或--color=always参数,其次设环境变量如CLICOLOR=1,Unix下可用pty.fork()模拟TTY,Windows不支持后者。
subprocess 默认会丢失 ANSI 色彩控制码,因为多数命令(如 ls --color=auto、grep --color=auto)检测到输出不是终端(tty)时,会自动禁用颜色。要捕获带颜色的 ANSI 输出,关键在于**欺骗子进程,让它认为自己正运行在支持颜色的终端中**。
让命令认为 stdout 是 tty(最常用)
很多命令只在检测到 stdout 是终端时才输出 ANSI 转义序列。可通过以下方式模拟:
-
使用
script命令(Linux/macOS):它创建伪终端(pty),天然支持颜色。script -qec "your_command" /dev/null——-q静默,-e保持退出码,-c执行命令,/dev/null忽略脚本日志头尾。 -
Python 中调用
script:import subprocess
result = subprocess.run(
["script", "-qec", "ls --color=auto /tmp"],
capture_output=True,
text=False # 保持 bytes,避免解码破坏转义码
)
print(result.stdout) # 包含 \x1b[34m 等 ANSI 序列
强制命令启用颜色(简单直接)
绕过终端检测,显式要求颜色输出:
-
ls --color=always、grep --color=always、docker ps --format "table {{.ID}}\t{{.Status}}" --color=always - 设置环境变量(对部分工具有效):
env = {"CLICOLOR": "1", "LS_COLORS": os.getenv("LS_COLORS", "")},再传给subprocess.run(..., env=env)
手动模拟 TTY(高级,跨平台兼容性稍弱)
Python 的 pty 模块(Unix only)可创建伪终端:
import pty
import os
pid, fd = pty.fork()
if pid == 0: # 子进程
os.execv("/bin/ls", ["ls", "--color=auto", "/tmp"])
else: # 父进程
output, _ = os.read(fd, 4096), os.close(fd)
print(output) # 含 ANSI
⚠️ 注意:Windows 不支持 pty;且需处理读取阻塞、缓冲、退出状态等细节,适合有控制需求的场景。
捕获后处理与显示
捕获到的字节流含原始 ANSI 序列(如 b'\x1b[32mOK\x1b[0m'),可:
- 直接写入支持 ANSI 的终端(如
sys.stdout.buffer.write(stdout)) - 用
ansi2html、rich或正则清洗/转换(如去除颜色:re.sub(b'\x1b\[.*?m', b'', stdout)) - 保存为文件供后续查看(需用支持 ANSI 的查看器,如
less -R)
不复杂但容易忽略:核心是让被调用程序“相信”它在终端里运行,而不是靠 Python 自己加色。优先试 --color=always 或 script,简洁可靠。
# linux
# python
# html
# docker
# windows
# 字节
# 工具
# mac
# unix
# macos
# 环境变量
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
再谈Python中的字符串与字符编码(推荐)
Python3.6正式版新特性预览
北京网站制作公司哪家好一点,北京租房网站有哪些?
Linux系统命令中screen命令详解
Laravel如何生成API文档?(Swagger/OpenAPI教程)
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
微信小程序 配置文件详细介绍
Laravel如何实现一对一模型关联?(Eloquent示例)
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
如何在IIS中新建站点并解决端口绑定冲突?
JavaScript如何实现音频处理_Web Audio API如何工作?
QQ浏览器网页版登录入口 个人中心在线进入
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel怎么连接多个数据库_Laravel多数据库连接配置
新三国志曹操传主线渭水交兵攻略
微信小程序 require机制详解及实例代码
Bootstrap CSS布局之列表
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel如何配置任务调度?(Cron Job示例)
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
大学网站设计制作软件有哪些,如何将网站制作成自己app?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何在Windows服务器上快速搭建网站?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
高端建站三要素:定制模板、企业官网与响应式设计优化
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何快速生成ASP一键建站模板并优化安全性?
如何用wdcp快速搭建高效网站?
如何快速重置建站主机并恢复默认配置?
如何在VPS电脑上快速搭建网站?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
JS碰撞运动实现方法详解
php结合redis实现高并发下的抢购、秒杀功能的实例
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel如何处理文件下载请求?(Response示例)
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?


