运行 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)
如果我这样做:
$ 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)