0

Есть вот такое код

import subprocess
print(subprocess.check_output("ping google.ru"))

В ответ печатает массив byte с кракозябрами. А как получить нормальную строку?

jfs
  • 52,361
Andru
  • 1,284
  • на всякий случай: вместо print(check_output(..)), можно просто check_call(..) вызвать (по умолчанию ping и print в одно место печатают). – jfs Apr 12 '17 at 11:01

2 Answers2

1

Нужно знать кодировку, которую использует ping команда, когда её вывод перенаправлен в канал (pipe).

Чтобы автоматически декодировать вывод внешней команды, используя locale.getpreferredencoding(False) кодировку (ansi code page на Windows, к примеру, cp1251 на русской Винде), можно передать universal_newlines=True аргумент (это неочевидное правописание для "включить текстовый режим" параметра. На Питоне 3.7 можно использовать более очевидное text=True):

from subprocess import check_output

output = check_output("ping example.com", universal_newlines=True)

Если вы не на Windows, то следует команду как список передать и указать параметры для ping для вашей системы, чтобы он остановился. На Винде можно строку использовать для указания команды.

Если другая кодировка используется для вывода команды, то можно её явно передать. К примеру:

import os

output = check_output("ping example.com", encoding=os.device_encoding(1))

В этом случае, cp866 кодировка может быть использована (GetConsoleOutputCP()). См. Byte при печати вывода внешней команды.

jfs
  • 52,361
-1

Нужно декодировать используя cp866

subprocess.check_output("ваша команда").decode('cp866')
Andru
  • 1,284
  • это неверно. Это может работать для одной команды, в одном выбранном окружении, но может сломаться для другой команды, в другом окружении -- люди, которые ваш ответ читают могут другие команды, в другом окружении запускать (отличном от вашего). К примеру, python команда при перенаправлении другую кодировку может использовать, или Windows на другом языке другую OEM cp может иметь. Поэтому не следует жёстко задавать кодировку, когда её программно можно найти . Я это кратко упомянул в своём ответе и более подробно по ссылке в нём изложено – jfs Apr 13 '17 at 12:11