【问题标题】:Can you have subprocesss.Popen retain color in stdout/stderr?您可以让 subprocess.Popen 在标准输出/标准错误中保留颜色吗?
【发布时间】:2016-10-31 06:56:04
【问题描述】:

我有以下代码:

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

这可以正常工作,除了它会删除所有发出的颜色。有没有办法保留这个?

【问题讨论】:

  • 您正在运行哪些命令?请注意,像grep 这样的程序会检查它们正在使用哪种类型的输出文件,如果它看起来不像终端,则不会输出颜色代码。如果您想强制它始终发送颜色代码,您必须使用选项--color=always。其他程序也这样做
  • 啊,当然,有道理 - 我在这个例子中尝试的命令是基于 ansible 的命令。跑出剧本,美丽的彩虹。在脚本中,不那么漂亮。
  • 彩色输出可能很棘手...某些程序(例如git)默认禁用颜色,因为它们是Popen('foo') 的一部分。如果我在彩色输出方面遇到问题,几乎总是,问题在于我从Popen() 调用的东西。尝试使用 CLI 选项强制颜色(如果 foo 有它们)。

标签: python python-2.7 popen


【解决方案1】:

您没有指定 whan cmd 是,但是当某些程序确定其标准输出实际上并未连接到终端时,它们不会发出终端上颜色输出所必需的 escape sequences

根据程序,您可能会也可能无法覆盖它。

使用ansible,您可以将force_color 配置变量设置为1 以强制颜色输出。

【讨论】:

  • 漂亮!当你在这里时,知道如何让我的输出停止在每一行上打印额外的\n 吗? (我不能再接受你的回答了,抱歉!)
【解决方案2】:

在 Python 脚本的顶部添加以下内容。

import os
os.environ['ANSIBLE_FORCE_COLOR'] = "TRUE"

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

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多