Задать вопрос
S0ulReaver
@S0ulReaver

Консоль Windows, Python и кодировки — как оно работает?

Обратил внимание на то, что subprocess.getoutput('ping ya.ru') возвращает кракозябры вместо русского текста. Пошёл разбираться в какой кодировке работает консоль, консоль говорит что это cp866. Окей, в принципе если использовать subprocess.check_output('ping ya.ru'), то я получу ответ в байтах который можно представить в виде нормального текста через decode("cp866").

И вот вроде бы проблемы больше нет, но любопытство не отпускает, хотелось нормальный результат из subprocess.getoutput получить. Нагуглил рецепт в котором полученный string сначала кодируют в CP1251, а затем декодируют в CP866.

subprocess.getoutput('ping ya.ru').encode('cp1251').decode('cp866')

Но теперь я не понимаю почему этот рецепт работает. Зачем необходим вот этот промежуточный encode в CP1251? Нам же вроде как консоль cp866 возвращала. Я понимаю что перед decode нужно как-то string из ответа в bytes перевести, но почему тогда не работает encode('cp866').decode('cp866')?
  • Вопрос задан
  • 834 просмотра
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@belotooth
В докухе написано, что это легаси функция, может уже не стоит ее использовать.
Вот так нормально вроде работает:
subprocess.check_output('ping ya.ru', encoding='cp866')
Ответ написан
Комментировать
@Andy_U
Насколько я помню, там разница если выводить прямо на (интерактивную) консоль или редирект в файл или в PIPE (тогда ANSI). По крайней мере для самого Питона. Вот тут немного есть...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽