python - 如何在执行 subprocess.Popen 时保留外壳上输出的原始颜色编码?

标签 python python-3.x subprocess

我有一个简单的 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 脚本,它会给出输出 联合国 有色。
subprocess.Popen 有争论吗?可以保留它运行的 shell 的颜色编码吗?
PS:
我在安装了 Python 3.9.0 的 MacOS 上的 bash shell 上运行这个 Python 脚本。

最佳答案

许多程序会检测自己是否连接到终端,并切换到不同的行为进行交互使用。
有些提供了强制交互功能的选项(尝试 ls --color=always 但究竟什么有效取决于您的平台;这不是标准化行为。macOS ls man page 说在环境中设置 CLICOLOR=yes)而其他人可能会被愚弄相信他们是使用 pty 交互运行图书馆,或 pexpect这是一个更高级别的包,更容易使用。

关于python - 如何在执行 subprocess.Popen 时保留外壳上输出的原始颜色编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67710641/

相关文章:

python - make_links_absolute() 导致绝对 URL 损坏

Python sleep() 禁止用逗号打印?

python - p.stdout.read() 在我的 Python 3 代码中不起作用

python - 如何使用子进程模块杀死(或避免)僵尸进程

python - 使用 subprocess.call 在内存中收集 stderr

Python:动态 "from"导入

python - 没有版本检查或 `six`,如何使用 `except MyError, e:`和 `except MyError as e`来与Python 2&3一起使用?

python - 如何在 Python 3.3 中复制自定义类的实例?

python-3.x - 从包含数字、非数字和数字的字符串中提取第一个数字序列

python - 子进程中 `shell` 中的 `shell=True` 是否表示 `bash` ?