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

我已经能够确认转义序列在cmd.exe中被正确提取,所以我有必要的更新。特别是,我尝试输入隐藏光标的prompt $e[?25l,然后输入prompt $e[?25h,它再次显示光标。
但是,如果我启动一个Python解释器,然后执行以下操作:
>>> import sys
>>> sys.stdout.write("\033[?25l")嗯,光标并没有隐藏。如何正确设置,以便控制台能够从Python中获取转义序列?
发布于 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转义序列处理。例如:
import ctypes
kernel32 = ctypes.windll.kernel32
kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)发布于 2018-03-06 13:44:31
这是我提出的here代码的改编,应该可以帮助您入门。在Windows 10上启用ANSI VT模式(虚拟终端处理)。传入标准输出或2标准错误的参数值1。
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发布于 2020-10-15 04:13:42
https://stackoverflow.com/questions/36760127
复制相似问题