修改
2022.7.31
感谢 @DavyZhou 的评论,对文章进行了一次大修改。
2022.8.2
又踩了一次坑,再补充一下
前言
本人的电脑配置为 Windows 11 , Python 版本是 Anaconda python 3.9 ,此问题在以前用的 Windows 10, Python 3.7 应可以复现。
当然,我的解决方法未必会是最好的,如有大佬看到错误或者有更简单的方法欢迎进行指正。
(文章为了让大家了解详细过程,可能有点水,觉得废话多的可以从"如何支持虚拟终端"开始看)
参考资料
标题 | 网址 |
---|---|
控制台虚拟终端序列 - Microsoft | https://docs.microsoft.com/zh-cn/windows/console/console-virtual-terminal-sequences |
console - PyPI | https://pypi.org/project/console/ |
Python - output of [31m text instead of color - stackoverflow | https://stackoverflow.com/questions/47432418/output-of-31m-text-instead-of-color |
colorama - PyPI | https://pypi.org/project/colorama/ |
Python colorama not working with input? - Stack Overflow | https://stackoverflow.com/questions/32872612/python-colorama-not-working-with-input#answer-68958376 |
背景
最开始,我打算写一个文件数据处理小工具和别人共享,由于对性能要求的误判,我本来打算用 C++ 追求性能(做完后发现这个一周用一次的东西 C++ 最多每次能提速15秒),结果就因为同时需要输入中文文件名并且使用UTF-8
编码这件事一直踩坑,(2022年了微软连utf-8都没搞明白),于是还是打算采用 Python + Pyinstaller 。
因为我不想搞太麻烦,所以就没有使用 GUI 图形界面。但是这也太单调了,我想要控制台有不同的颜色,起码好看一点。我想起了以前看到过的 colorama 库,上次在 IDLE 跑出来一堆乱码,但我想这大概是 IDLE 的问题吧。然而,事情的发展远超出我的预料,在 cmd 上居然也跑不了?不过,在 C++ 探索中,我发现了这么一个东西——
控制台虚拟终端序列
控制台虚拟终端序列是这么一个东西(以下内容是 Microsoft Windows 官方的文档):
虚拟终端序列是控制字符序列,可在写入输出流时控制游标移动、控制台颜色和其他操作。 在输入流上也可以接收序列,以响应输出流查询信息序列,或在设置适当模式时作为用户输入的编码。
可以使用 GetConsoleMode 和 SetConsoleMode 函数配置此行为 。 本文档末尾包含了建议的启用虚拟终端行为的方法的示例。
以下序列的行为基于 VT100 和派生终端仿真器技术,尤其是 xterm 终端仿真器。 有关终端序列的详细信息,请访问 http://vt100.net 和 http://invisible-island.net/xterm/ctlseqs/ctlseqs.html。
相信大家也发现了微软写的文档(尤其是中文版)属实写的有点不明不白的,而且整个页面给一堆链接也不知道该往哪去找。
简而言之,虚拟终端序列是一串控制字符序列,它们都以ESC
开始( ASCII 编码为十进制 27 ,八进制 33 ,十六进制 1B ,因此在 Python 中可以写作