Есть вот такое код
import subprocess
print(subprocess.check_output("ping google.ru"))
В ответ печатает массив byte с кракозябрами. А как получить нормальную строку?
Есть вот такое код
import subprocess
print(subprocess.check_output("ping google.ru"))
В ответ печатает массив byte с кракозябрами. А как получить нормальную строку?
Нужно знать кодировку, которую использует 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 при печати вывода внешней команды.
Нужно декодировать используя cp866
subprocess.check_output("ваша команда").decode('cp866')
python команда при перенаправлении другую кодировку может использовать, или Windows на другом языке другую OEM cp может иметь. Поэтому не следует жёстко задавать кодировку, когда её программно можно найти . Я это кратко упомянул в своём ответе и более подробно по ссылке в нём изложено
– jfs
Apr 13 '17 at 12:11
print(check_output(..)), можно простоcheck_call(..)вызвать (по умолчаниюpingиprintв одно место печатают). – jfs Apr 12 '17 at 11:01