Spec-Zone.ru › click

Заметки по консоли 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.echo print.
  • В 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API