首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Windows 10控制台中使用对ANSI转义序列的新支持?

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

Stack Overflow用户
提问于 2016-04-21 13:07:18
回答 3查看 10.9K关注 0票数 24

最新的Windows10更新包括conhost.exe中的support for ANSI escape sequences

我已经能够确认转义序列在cmd.exe中被正确提取,所以我有必要的更新。特别是,我尝试输入隐藏光标的prompt $e[?25l,然后输入prompt $e[?25h,它再次显示光标。

但是,如果我启动一个Python解释器,然后执行以下操作:

代码语言:javascript
运行
复制
>>> import sys
>>> sys.stdout.write("\033[?25l")

嗯,光标并没有隐藏。如何正确设置,以便控制台能够从Python中获取转义序列?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-21 14:02:20

问题是Python解释器不支持ANSI转义序列的处理。ANSI序列在Windows命令提示符下工作,因为cmd确实启用了它们。如果从命令提示符启动Python,您会发现ANSI序列确实有效,包括启用和禁用游标的序列。这是因为cmd已经为控制台窗口启用了它们。

如果您想要启动Python解释器并启用ANSI转义,您可以创建一个快捷方式来运行类似于cmd /c C:\PythonXY\python的命令。

另一个更困难的解决方案是使用ctype通过设置了ENABLE_VIRTUAL_TERMINAL_PROCESSING标志的SetConsoleMode Windows API调用ANSI来启用控制台窗口的ANSI转义序列处理。例如:

代码语言:javascript
运行
复制
import ctypes

kernel32 = ctypes.windll.kernel32
kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)
票数 37
EN

Stack Overflow用户

发布于 2018-03-06 13:44:31

这是我提出的here代码的改编,应该可以帮助您入门。在Windows 10上启用ANSI VT模式(虚拟终端处理)。传入标准输出或2标准错误的参数值1

代码语言:javascript
运行
复制
def _windows_enable_ANSI(std_id):
    """Enable Windows 10 cmd.exe ANSI VT Virtual Terminal Processing."""
    from ctypes import byref, POINTER, windll, WINFUNCTYPE
    from ctypes.wintypes import BOOL, DWORD, HANDLE

    GetStdHandle = WINFUNCTYPE(
        HANDLE,
        DWORD)(('GetStdHandle', windll.kernel32))

    GetFileType = WINFUNCTYPE(
        DWORD,
        HANDLE)(('GetFileType', windll.kernel32))

    GetConsoleMode = WINFUNCTYPE(
        BOOL,
        HANDLE,
        POINTER(DWORD))(('GetConsoleMode', windll.kernel32))

    SetConsoleMode = WINFUNCTYPE(
        BOOL,
        HANDLE,
        DWORD)(('SetConsoleMode', windll.kernel32))

    if std_id == 1:       # stdout
        h = GetStdHandle(-11)
    elif std_id == 2:     # stderr
        h = GetStdHandle(-12)
    else:
        return False

    if h is None or h == HANDLE(-1):
        return False

    FILE_TYPE_CHAR = 0x0002
    if (GetFileType(h) & 3) != FILE_TYPE_CHAR:
        return False

    mode = DWORD()
    if not GetConsoleMode(h, byref(mode)):
        return False

    ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
    if (mode.value & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0:
        SetConsoleMode(h, mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
    return True
票数 3
EN

Stack Overflow用户

发布于 2020-10-15 04:13:42

colorama包在Windows中启用了ANSI码。

用法:

代码语言:javascript
运行
复制
from colorama import init
init()

在此之后,ANSI代码应该可以工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36760127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档