Ошибка кодирования консоли Windows cx_freeze

У меня есть скрипт Python 3.4, который имеет дело с символами Юникода, диакритическими знаками и т. Д. Скрипт отлично работает на Mac и Windows. Если я замораживаю его в исполняемый файл Windows (зависает в Windows!)

python cxfreeze verifier.py -cOO --target-dir verifier

и попытаюсь запустить его, это даст мне следующее исключение при выполнении вывода

Traceback (most recent call last):
  File "C:\Python34\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
exec(code, m.__dict__)
  File "C:\Users\me\Desktop\verifier\verifier.py", line 520, in <module>
main()
  File "C:\Users\me\Desktop\verifier\verifier.py", line 484, in main
ConsoleManager.dynamic_print(MSG_VERIFYING_FILE.format(relativePath))
  File "C:\Users\me\Desktop\verifier\verifier.py", line 230, in dynamic_print
ConsoleManager.print(message, end='\r')
  File "C:\Users\me\Desktop\verifier\verifier.py", line 226, in print
print(message, end=end)
  File "X:\Python34-x32\lib\encodings\cp866.py", line 19, in encode
UnicodeEncodeError: 'charmap' codec can't encode character '\u0456' in position 16: character maps to <undefined>

Интересно, почему «cp866»? Скрипт работает исключительно с utf-8 и никаких ссылок на кодировку cp866 не было! Похоже, cx_Freeze пытается вывести поток utf-8 на консоль, например поток cp866.

Как я могу указать сценарию cx_Freeze exe-creator выполнять весь вывод консоли в utf-8?

Буду рад любой помощи.

ОБНОВЛЕНИЕ: найдено http://sourceforge.net/p/cx-freeze/mailman/message/24126644/ возможно дело в возникшей проблеме


person kernelbug    schedule 24.09.2014    source источник
comment
Если Python решит, что ваша консольная кодировка — cp866, он попытается использовать ее при печати строк Unicode. Я думаю, что есть некоторая работа, чтобы заставить Python использовать Unicode API для консоли Windows, но она еще не приземлилась. Тем временем вы можете записывать байты напрямую в sys.stdout.buffer, если знаете, какая кодировка правильная.   -  person Thomas K    schedule 24.09.2014
comment
Когда вы пробовали скрипт, вы запускали его в командной строке или в какой-либо консоли IDE, например PyDev, IDLE и т. д.? Потому что обычно это utf-8, в отличие от консоли Windows.   -  person Fenikso    schedule 24.09.2014
comment
@Fenikso, я пробовал это, консоль cygwin поддерживает юникод (и Windows PowerShell, я думаю, тоже его поддерживает), и все будет хорошо, если вы запустите скрипт как есть, с python.exe. Проблема возникла только с зависшим скриптом.   -  person kernelbug    schedule 25.09.2014
comment
@ThomasK, может быть, я попробую ваше решение, если не смогу обойти ошибку cx_freeze.   -  person kernelbug    schedule 25.09.2014
comment
@ThomasK, я попробовал ваш обходной путь - не помогло, потому что sys.stdout.buffer.write(message.encode('utf-8')) пишет поток utf-8, но выходная кодировка все еще cp866, насколько я понимаю, и мы видим странные символы cp866 на выходе   -  person kernelbug    schedule 25.09.2014
comment
Если ваша консоль использует cp866, то это единственные символы, которые вы можете напечатать с помощью стандартных API-интерфейсов Python. Взгляните на win_unicode_console, это может вам помочь. Похоже, это может быть исправлено для Python 3.5.   -  person Thomas K    schedule 25.09.2014
comment
Спасибо @ThomasK! win_unicode_console действительно помог мне решить эту проблему с консолью. Кстати ошибок было много, некоторые из них описаны здесь comments.gmane.org/gmane.comp.python.cx-freeze.user/1856 , например AttributeError при зависании скрипта   -  person kernelbug    schedule 25.09.2014


Ответы (1)


Попробуйте выполнить в консоли Windows следующее:

chcp 65001
set PYTHONIOENCODING=utf-8
person Olexiy    schedule 15.03.2017