Задать вопрос
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')?
  • Вопрос задан
  • 922 просмотра
Подписаться 2 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
@belotooth
В докухе написано, что это легаси функция, может уже не стоит ее использовать.
Вот так нормально вроде работает:
subprocess.check_output('ping ya.ru', encoding='cp866')
Ответ написан
Комментировать
@Andy_U
Насколько я помню, там разница если выводить прямо на (интерактивную) консоль или редирект в файл или в PIPE (тогда ANSI). По крайней мере для самого Питона. Вот тут немного есть...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽