运行 subprocess.run 时捕捉颜色

Capture color when running subprocess.run

如果我这样做:

$ mkdir foo
$ touch foo/__init__.py

然后运行

$ mypy foo             
Success: no issues found in 1 source file

然后“成功:在 1 个源文件中未发现问题”显示为绿色。

但是,如果我用

创建文件 t.py
import subprocess

output = subprocess.run(['mypy', 'foo'], text=True, capture_output=True)
print(output)

和运行它:

$ python t.py
CompletedProcess(args=['mypy', 'foo'], returncode=0, stdout='Success: no issues found in 1 source file\n', stderr='')

然后 stdout 只包含消息 - 颜色消失了,重建它的希望也消失了。

那么,我如何才能从 t.py 中 运行 mypy foo 获得 stdout 中的颜色?

TL;DR

import subprocess, os
my_env = os.environ.copy()
my_env['MYPY_FORCE_COLOR'] = '1'

output = subprocess.run(['mypy', 'foo'], text=True, capture_output=True, env=my_env);
print(output.stdout)

首先,大多数控制台程序输出没有颜色的数据是正常的,如果他们认为他们没有在交互模式下运行。
所以,我们需要强制它这样做。

There is an undocumented environment variable MYPY_FORCE_COLOR that will force color. (source)

到目前为止,mypy 还没有记录在案的命令行选项来执行此操作,但我们可以使用此 hack。 请注意,这种行为可能有一天会改变!

代码:

# ...
import os
my_env = os.environ.copy()
my_env['MYPY_FORCE_COLOR'] = '1'

# Set modified env
subprocess.run(..., env=my_env);
# ...

然后,打印实际的标准输出以查看 ANSI 转义码(即颜色)。

print(output.stdout)