如何在执行 subprocess.Popen 时保留 shell 输出的原始颜色编码?

How to preserve original color coding of output on the shell while doing a subprocess.Popen?

我有一个简单的 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 上 运行ning 这个 Python 脚本。

很多程序会检测自己是否连接到终端,并切换到不同的行为以供交互使用。

一些选项提供了强制交互功能的选项(尝试 ls --color=always 但具体效果取决于您的平台;这不是标准化行为。macOS ls man page 表示在环境)和其他人可以通过使用 pty 库或 pexpect 这是一个更高级别的包并且更容易使用 [=16] =]