python 在powershell中使用Tee-Object时如何保留颜色?

w1jd8yoj  于 2023-08-02  发布在  Python
关注(0)|答案(2)|浏览(91)

我写了一个python脚本,输出是彩色的。我有一个powershell脚本来自动执行它并保存它的输出,如下所示:

$python = "path\to\python"
& $python main.py | Tee-Object -FilePath "$logfile"

字符串
如果我删除T形物体部分,颜色显示通过刚刚好。如果有关系的话:对于颜色输出,我使用colorama和termcolor python模块。
有没有人对如何解决这个问题有任何建议?

qvsjd97n

qvsjd97n1#

您的own answer通过Start-Transcript展示了一个有效的解决方案。[1]
至于你的问题的原因:

不是Tee-Object剥离颜色,而是Python脚本本身,大概是因为您用于着色的模块检测到输出没有发送到 screen(终端)

此行为是通过设计实现的:其基本原理是,如果您将某些内容发送到文件或通过管道发送,则您只对原始文本信息感兴趣,而不是颜色。一些Unix实用程序允许您使用命令行选项覆盖此默认行为(例如,GNU grep--color=always)。
coloroma模块似乎也有这样一个覆盖特性(还没有看过termcolor),通过它的init()函数(init(strip=False))-但是,您不想将此行为硬连接到您的脚本中,所以也许实现一个类似于GNU grep所做的命令行选项是一个选项。
以下是Tee-Object实际上传递VT(虚拟终端)序列/ ANSI颜色代码的快速演示:

# The VT escape sequences (ANSI codes) *are* sent to log.txt
# Prints the word "green" in green, both instantly and when calling
# Get-Content log.txt later.
"It ain't easy being $([char] 27)[32mgreen$([char] 27)[m." | Tee-Object log.txt

字符串

注意事项

  • Windows PowerShell(最高版本5.1)中-至少使用colorama输出- * 空行在通过Tee-Object时会用背景色填充,然后生效 *,因为输出格式化系统会用空格填充输出行。
  • PowerShell (Core) 7+不再有这个问题。

[1]该解决方案在 Windows PowerShell 中有效。在PowerShell(Core)中,至少到v7.3.6,Start-Transcript * 总是 * 剥离VT/ANSI转义序列,即使$PSStyle.OutputRendering = 'Ansi'有效。参见GitHub issue #11567进行讨论。

e0uiprwp

e0uiprwp2#

我用Start-Transcript而不是Tee-Object来保存输出,运气不错。

Start-Transcript -path "$logfile"
& $python main.py
Stop-Transcript

字符串
我不确定是因为Tee-Object剥离了颜色,还是因为Tee-Object不是tty而导致颜色不能正确输出,但这绕过了这两个问题。

相关问题