使用Python子进程时,ANSI颜色丢失。

13

我想在另一个Python进程内运行一个程序。这个程序在ANSI终端模拟器中运行时通常会有着彩色的输出。但当我让控制的Python程序来打印子进程的输出时,就看不到任何颜色了。在读取并输出到屏幕时,从子进程中获取的颜色信息丢失了。

print(subp.stdout.readline())

1
请参见:https://dev59.com/ukzSa4cB1Zd3GeqPlEeq - Stephen Rauch
1个回答

14

产生彩色输出的进程会在输出中混合发送转义码到终端(仿真器),程序处理这些数据时可能会因转义码而困惑。因此,大多数在终端上产生彩色输出的程序只有在写入终端设备时才会这样做。如果程序的标准输出连接到管道而不是终端设备,则不会产生转义码。当Python读取子进程的输出时,它通过一个管道来完成,因此你在子进程中调用的程序不会输出转义码。

如果你只是将输出发送到终端,则可能需要转义码以保留颜色。你的程序可能有一个命令行开关来输出转义码,而不考虑输出设备。如果没有,你可以运行子进程针对虚拟终端设备而不是管道,以便它输出转义码;但这是一个过于复杂的话题,无法在此回答中详细介绍。


谢谢。我不太理解这句话的意思:“如果你对输出的所有操作都是将其发送到终端,那么你可能需要转义代码来保留颜色”。你的意思是转义ANSI颜色代码吗? - Herbert
@Herbert -- 如果您正在获取进程的输出并将其写入终端,并且您想要查看彩色输出,则需要包含转义代码。 - antlersoft
1
子进程是一个Tcl脚本。我尝试通过将子进程的stdout设置为sys.stdout而不是PIPE来打开它。这样可以保留颜色。我不认为我能够更改Tcl中print函数的行为。所以你可以给我一个将输出定向到虚拟终端的链接吗?谢谢。 - Herbert
1
@Herbert - 在Tcl中实现这个功能的方法是使用expect;而在Python中,有一个名为pexpect的模块也可以实现同样的功能。不过除此之外,我就不太清楚了。你可以参考pexpect.readthedocs.io获取更多信息。 - antlersoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接