【问题标题】:How to preserve original color coding of output on the shell while doing a subprocess.Popen?如何在执行 subprocess.Popen 时保留外壳上输出的原始颜色编码?
【发布时间】:2021-05-26 18:18:53
【问题描述】:

我有一个简单的 Python 脚本,可以实时打印命令的输出。以下是脚本:

#!/usr/bin/env python3
import subprocess

def RunSubProcess(process, process_args):
    process = subprocess.Popen([process, process_args], 
                               stdout=subprocess.PIPE, 
                               stderr=subprocess.PIPE, 
                               universal_newlines=True)
    while process.stdout.readable():
        line = process.stdout.readline()
        if not line:
            break
        print(line.strip())

RunSubProcess('ls', '-la')

该脚本可以很好地完成它应该做的事情,但它会丢失我 shell 上输出的颜色编码。如果我输入ls -la,我会得到很好的输出颜色。但是如果我运行上面的 Python 脚本,它会给出输出 uncolored.

subprocess.Popen 是否有一个参数可以保留其运行的 shell 的颜色编码?

PS:
我在安装了 Python 3.9.0 的 MacOS 上的 bash shell 上运行这个 Python 脚本。

【问题讨论】:

    标签: python python-3.x subprocess


    【解决方案1】:

    许多程序会检测它们是否连接到终端,并切换到不同的行为以进行交互使用。

    有些提供强制交互功能的选项(尝试ls --color=always,但具体的工作方式取决于您的平台;这不是标准化行为。macOS ls man page 表示要在环境中设置CLICOLOR=yes),而其他人可能会被愚弄相信它们是通过使用 pty 库或 pexpect 以交互方式运行的,这是一个更高级别的包,并且更易于使用。

    【讨论】:

    • 你通常应该avoid ls in scripts 但我猜你是用它作为例子。
    • 是的,ls 只是展示我的问题的一个例子
    • 是否可以仅将stderr 的输出颜色编码为红色?它应该是。我应该尝试在print 通话中做一些技巧
    • 您可以轻松地将颜色代码添加到 Python 端的标准错误中。当然,您必须从 subprocess 调用中捕获它。
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多