Windows 控制台注释 — 单击文档

来自菜鸟教程
Click/docs/6.x/wincmd
跳转至:导航、​搜索

Windows 控制台说明

6.0 版中的新功能。


在 Click 6.0 之前,在 Windows 控制台上使用 Click 存在各种错误和限制。 最值得注意的是,命令行参数的解码是在 Python 2 上以错误的编码执行的,并且在所有版本的 Python 输出的 unicode 字符上都是不可能的。 从 Click 6.0 开始,我们现在在 Windows 上模拟输出流,以通过单独的 API 支持到 Windows 控制台的 unicode,并且我们执行不同的参数解码。

以下是有关其工作原理及其对您的意义的简要概述。

Unicode 参数

单击内部通常基于这样的概念,即任何参数都可以作为字节字符串或 unicode 字符串传入,并且尽可能晚地执行到类型预期值的转换。 这有一些优点,因为它允许我们以最适合操作系统和 Python 版本的形式接受数据。

例如,除非您明确告诉它,否则路径在 Python 2 上保留为字节。

这在 Windows 上引起了一些问题,最初使用了错误的编码并且输入数据中最终出现了垃圾。 我们不仅修复了编码部分,而且现在还从 sys.argv 中提取了 unicode 参数。

这意味着在 Windows 下的 Python 2 上,处理的参数将 最有可能 是 unicode 性质而不是字节。 除非您明确传入 unicode 参数,否则以前不会真正发生这种情况,因此您的自定义类型需要注意这一点。

这还有另一个限制:如果在调用点击处理程序之前修改了 sys.argv,我们必须回退到常规字节输入,在这种情况下,并非所有 unicode 值都可用,而只有一个子集用于参数的代码页。


Unicode 输出和输入

Windows 上的 Unicode 输出和输入是通过分派文本流的概念实现的。 这意味着当单击首先需要 Windows 上的文本输出(或输入)流时,它会通过一些检查来确定 Windows 控制台是否已连接。 如果不存在 Windows 控制台,则文本输出流将按原样返回,并且该流的编码设置为 utf-8,就像在所有平台上一样。

但是,如果连接了控制台,则将改为模拟流并使用 cmd.exe unicode API 来输出文本信息。 在这种情况下,流还将使用 utf-16-le 作为内部编码。 然而,有一些骇人听闻的情况是,底层的原始 IO 缓冲区仍然绕过 unicode API,并且仍然可以通过间接方式输出字节。

这个hackery 用于Python 2 和Python 3,因为这两个版本的Python 都没有对带有unicode 字符的cmd.exe 的本机支持。 您需要注意一些限制:

  • 此 Unicode 支持仅限于 click.echoclick.prompt 以及 click.get_text_stream
  • 根据是否传递 unicode 值或字节字符串,控制流在内部完全不同的地方,如果数据部分最终被缓冲,可能会有一些奇怪的工件。 Click 尝试通过手动始终刷新来防止这种情况发生,但如果您将不同的字符串类型混合并匹配到 stdoutstderr,您将需要手动刷新。

另一个需要注意的重要事项是 Windows 控制台的默认字体不支持大量字符,这意味着您主要限于国际字母,但没有表情符号或特殊字符。