你能让subprocess.Popen在stdout/stderr中保留颜色吗?

6

I have the following code:

p = subprocess.Popen(cmd.split(' '), env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while(True):
      log.info(p.stdout.readline())
      if(p.poll() is not None):
        break

这个方法可以正常工作,但会移除所有的颜色。有没有办法保留颜色呢?


1
你在运行哪些命令?请注意,像 grep 这样的程序会检查它们使用的输出文件类型,如果它看起来不像终端,则不会输出彩色代码。如果您想强制它始终发送彩色代码,则必须使用选项 --color=always。其他程序也是这样做的。 - Bakuriu
啊,明白了 - 我在这个例子中尝试的命令是基于 ansible 的命令。在脚本外运行时,色彩斑斓,美不胜收。但在脚本中运行时,就没有那么漂亮了。 - MrDuk
https://dev59.com/rLTna4cB1Zd3GeqPAtOg - aleung
彩色输出可能会很棘手......某些程序(例如git)在作为 Popen('foo') 的一部分时默认禁用颜色。如果我在彩色输出方面遇到问题,几乎总是由于我从Popen()调用的东西出了问题。尝试使用CLI选项(如果foo有它们)强制使用颜色。 - Mike Pennington
2个回答

5
你没有指定cmd是什么,但有些程序在确定其标准输出实际上未连接到终端时,不会发出终端颜色输出所必需的转义序列。根据程序的不同,你可能无法覆盖它。使用ansible,你可以将force_color配置变量设置为1来强制进行彩色输出。

太好了!在这里,你有任何想法如何让我的输出停止在每行上打印额外的\n吗?(我还需要几分钟才能接受你的答案,抱歉!) - MrDuk

-1
在你的Python脚本顶部添加以下内容。
import os
os.environ['ANSIBLE_FORCE_COLOR'] = "TRUE"

现在,如果您使用subprocess.Popen从Python运行Ansible,它将打印颜色。


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