Как ` :: OutputEncoding / InputEncoding` с Python?

Под Powershell v5, Windows 8.1, Python 3. Почему это не удается и как исправить?

[system.console]::InputEncoding = [System.Text.Encoding]::UTF8; [system.console]::OutputEncoding = [System.Text.Encoding]::UTF8; chcp; "import sys print(sys.stdout.encoding) print(sys.stdin.encoding) sys.stdout.write(sys.stdin.readline()) " | sc test.py -Encoding utf8; [char]0x0422+[char]0x0415+[char]0x0421+[char]0x0422+"`n" | py -3 test.py 

печатает:

 Active code page: 65001 cp65001 cp1251 п»ї???? 

2 Solutions collect form web for “Как ` :: OutputEncoding / InputEncoding` с Python?”

Вы передаете данные в Python; в этот момент stdin Python больше не привязан к TTY (вашей консоли) и не догадается, что такое кодировка. Вместо этого используется локаль системы по умолчанию; на вашей системе, которая является cp1251 (кодовая страница на основе Windows Latin-1).

Установите PYTHONIOENCODING среды PYTHONIOENCODING для переопределения:

PYTHONIOENCODING
Если это задано перед запуском интерпретатора, оно переопределяет кодировку, используемую для stdin / stdout / stderr, в синтаксисе encodingname:errorhandler . И имя encodingname и части :errorhandler являются необязательными и имеют то же значение, что и в str.encode() .

Кажется, что PowerShell не поддерживает переменные окружения командной строки, как это делают оболочки UNIX; проще всего просто установить переменную:

 Set-Item Env:PYTHONIOENCODING "UTF-8" 

или даже

 Set-Item Env:PYTHONIOENCODING "cp65001" 

поскольку кодовая страница Windows UTF-8, по-видимому, не совсем UTF-8, в зависимости от версии Windows и от перенаправления или без перенаправления труб.

Почему бы не включить CPython в powershell ?! CPython настолько прост для встраивания, и powershell очень хорош REPL, чтобы играть с .NET и COM-объектами . Вот простое введение в использование pythonnet из PowerShell. Обратите внимание, как кодирование автоматически распространяется с powershell на python.

 Windows PowerShell Copyright (C) 2015 Microsoft Corporation. All rights reserved. PS C:\Users\denfromufa> [system.console]::InputEncoding = [System.Text.Encoding]::UTF8; PS C:\Users\denfromufa> [system.console]::OutputEncoding = [System.Text.Encoding]::UTF8; PS C:\Users\denfromufa> [Reflection.Assembly]::LoadFile("C:\Python\Miniconda3_64b\Lib\site-packages\Python.Runtime.dll") GAC Version Location --- ------- -------- False v4.0.30319 C:\Python\Miniconda3_64b\Lib\site-packages\Python.Runtime.dll PS C:\Users\denfromufa> $gil = [Python.Runtime.Py]::GIL() PS C:\Users\denfromufa> $sys=[Python.Runtime.Py]::Import("sys") PS C:\Users\denfromufa> $sys.stdin.encoding.ToString() cp65001 PS C:\Users\denfromufa> $sys.stdout.encoding.ToString() cp65001 PS C:\Users\denfromufa> $gil.Dispose() PS C:\Users\denfromufa> [Python.Runtime.PythonEngine]::Shutdown() PS C:\Users\denfromufa> 
  • Печать stdout в Python без escape-последовательностей оболочки
  • Время ожидания докера для контейнера?
  • Vim запуск ярлыка
  • Как запустить сценарий Python портативно, не указывая его полный путь
  • Как выполнить код в оболочке Django с помощью внешнего скрипта python?
  • Вызовите скрипт Python из bash с аргументом
  • как сделать подпроцесс, вызванный с помощью вызова / Popen, наследовать переменные среды
  • Что такое `-a` в функции Zshell и что это связано с моей оболочкой, немедленно выходящей?
  • Как запустить скрипт python из интерактивной оболочки IDLE?
  • Есть ли способ поставить вывод Python Shell в окно tkinter?
  • Сценарий IDLE Python не показывает вывод подпроцесса, но cmd.exe делает
  • Python - лучший язык программирования в мире.