Заметки по консоли Windows
Журнал изменений
Новое в версии 6.0.
Click эмулирует потоки вывода на Windows для поддержки юникода в консоли Windows через отдельные API, и мы выполняем различное декодирование параметров.
Вот краткий обзор того, как это работает и что это значит для вас.
Аргументы Юникод
Click во внутренней работе в целом основан на концепции, что любой аргумент может поступать как строка байтов, так и строка юникод, и преобразование выполняется в ожидаемый тип значения как можно позже. Это имеет некоторые преимущества, поскольку позволяет принимать данные в наиболее подходящей форме для операционной системы и версии Python.
Это вызвало некоторые проблемы в Windows, где изначально использовалось неправильное кодирование, и мусор попал в ваши входные данные. Мы не только исправили часть кодирования, но и теперь извлекаем параметры юникод из sys.argv.
Также есть еще одно ограничение: если sys.argv был изменен до вызова обработчика click, мы должны вернуться к обычному вводу байтов, в этом случае доступны не все значения юникода, а только подмножество кодовой страницы, используемой для параметров.
Вывод и ввод Юникод
Вывод и ввод юникода в Windows реализуются с помощью концепции диспетчерируемого текстового потока. Это означает, что когда click впервые нуждается в текстовом потоке вывода (или ввода) в Windows, он проходит несколько проверок, чтобы выяснить, подключена ли консоль Windows или нет. Если консоль Windows отсутствует, то текстовый поток вывода возвращается как таковой, а кодирование этого потока устанавливается в utf-8 как на всех платформах.
Однако, если консоль подключена, поток будет эмулироваться и использовать API юникода cmd.exe для вывода текстовой информации. В этом случае поток также будет использовать utf-16-le в качестве внутренней кодировки. Однако есть некоторые ухищрения, заключающиеся в том, что базовый буфер необработанного ввода-вывода все еще обходит API юникода, и вывод байтов через косвенную ссылку все еще возможен.
- Эта поддержка юникода ограничена
click.echo,click.promptиclick.get_text_stream. - В зависимости от того, передаются ли значения юникода или строки байтов, поток управления идет в совершенно другие места внутри, что может привести к некоторым странным артефактам, если данные частично окажутся в буфере. Click пытается защититься от этого, вручную всегда сбрасывая буфер, но если вы смешиваете и сопоставляете разные типы строк в
stdoutилиstderr, вам необходимо вручную сбросить буфер. - Поток необработанного вывода настроен в двоичном режиме, что является глобальной операцией в Windows, поэтому
printвызовы будут затронуты. Предпочитайтеclick.echoprint. - В Windows 7 и ниже существует ограничение, где в одном вызове в двоичном режиме можно записать не более 64К символов. В этой ситуации
sys.stdoutиsys.stderrзаменяются обертками, которые работают вокруг ограничения.
Еще одна важная деталь: шрифты по умолчанию консоли Windows не поддерживают много символов, что означает, что вы в основном ограничены международными буквами, но без эмодзи или специальных символов.
© Copyright 2014 Pallets.
Licensed under the BSD 3-Clause License.
We are not supported nor endorsed by Pallets.
https://click.palletsprojects.com/en/8.1.x/wincmd/