Как сохранить цвета при использовании Tee-Object в powershell? - PullRequest
2 голосов
/ 12 апреля 2020

Я написал python скрипт с цветным выводом. У меня есть скрипт powershell для автоматизации его выполнения и сохранения выходных данных, например:

$python = "path\to\python"
& $python main.py | Tee-Object -FilePath "$logfile"

Если я удаляю часть Tee-Object, цвета хорошо видны. В случае, если это имеет значение: для вывода цвета я использую модули colorama и termcolor python.

Есть ли у кого-нибудь какие-либо предложения о том, как обойти эту проблему?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Ваш собственный ответ показывает эффективное решение с помощью Start-Transcript.

По причине:

Это не ' t Tee-Object, который отбрасывает цвета , но сам скрипт Python , предположительно потому, что модули, которые вы используете для окрашивания, обнаруживают, что вывод не отправляется на screen (терминал) .

Такое поведение является заданным: логическое обоснование состоит в том, что если вы отправляете что-то в файл или по конвейеру, вас интересует только необработанная текстовая информация, не окраска. Некоторые утилиты Unix позволяют переопределить это поведение по умолчанию с помощью параметров командной строки (например, GNU grep имеет --color=always).

Модуль coloroma , похоже, имеет такой Функция переопределения тоже (не смотрела на termcolor), через ее функцию init() (init(strip=False)) - однако, вам не захочется жестко связывать это поведение с вашими сценариями, поэтому, возможно, реализовать командную строку опция, аналогичная GNU grep, является опцией.

Быстрая демонстрация того факта, что Tee-Object действительно передает последовательности VT (виртуальный терминал) / цветовые коды ANSI через:

# The VT escape sequences (ANSI codes) *are* sent to log.txt
# Prints the word "green" in green, both instantly and when calling
# Get-Content log.txt later.
"It ain't easy being $([char] 27)[32mgreen$([char] 27)[m." | Tee-Object log.txt

Предостережение :

  • In Windows PowerShell (до версии 5.1) - по крайней мере с выходом colorama - пустые строки заполняются цветом фона, который действует , когда они проходят через Tee-Object, потому что система форматирования вывода дополняет строки вывода пробелами.

  • PowerShell [Core] 7 + больше не имеет этой проблемы.

2 голосов
/ 12 апреля 2020

Мне повезло, используя Start-Transcript, чтобы сохранить вывод вместо Tee-Object.

Start-Transcript -path "$logfile"
& $python main.py
Stop-Transcript

Я не уверен, удаляет ли Tee-Object цвета или цвета не отображаются. t выводится правильно, потому что Tee-Object не является tty, но это обходит любую проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...