将 ansi 打印到 windows cmd 在 IPython 中有效,但在其他任何地方都无效。为啥?

Posted

技术标签:

【中文标题】将 ansi 打印到 windows cmd 在 IPython 中有效,但在其他任何地方都无效。为啥?【英文标题】:Printing ansi to windows cmd works in IPython, but not anywhere else. Why?将 ansi 打印到 windows cmd 在 IPython 中有效,但在其他任何地方都无效。为什么? 【发布时间】:2017-12-24 03:26:01 【问题描述】:

我正在努力使我的一些代码跨平台,这意味着我正在与 Windows 问题作斗争。我目前无法在终端中显示颜色。

我主要使用 pygments 来处理颜色。当我进入时:

python -c "import pygments.console; print(pygments.console.colorize('red', 'hi'))"

在 win32 控制台(或 git bash 中)我得到这个:

    [31;01mhi[39;49;00m 

但是,如果我打开 IPython 并输入相同的命令,它会起作用:

$ ipython
Python 3.6.3 |Anaconda, Inc.| (default, Nov  8 2017, 15:10:56) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import pygments.console

In [2]:  print(pygments.console.colorize('red', 'hi'))
hi

In [3]:

请注意,在此示例中,hi 确实打印为红色。

这是如何工作的?当文本写入标准输出时,IPython 是否在做一些聪明的事情并用 colorama 的 windows 代码替换 ansi 序列?还是 IPython 对终端做了一些让 ansi 工作的事情?

不管怎样,有没有办法让 pygments colorize 函数在 windows 环境中表现良好?

【问题讨论】:

【参考方案1】:

似乎正在使用标准输出拦截方法。它不是 IPython,而是 colorama 本身。我想我误解了那个模块在做什么。

在执行的win32 cmd终端中让ansii颜色正确显示

import colorama
colorama.init()

将导致 ansi 在会话的其余部分工作。

【讨论】:

以上是关于将 ansi 打印到 windows cmd 在 IPython 中有效,但在其他任何地方都无效。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 10 控制台中使用对 ANSI 转义序列的新支持?

修改windows的cmd编码格式为UTF-8

windows环境变量如何在cmd中打印

如何在Windows 10控制台中使用ANSI转义序列的新支持?

windows10下32位软件里调用驱动打印

Python `string.format()`、填充字符和 ANSI 颜色