Чтение из подпроцесса дает вам bytestring. Вы можете либо декодировать эти байты (вы должны найти подходящую кодировку), или использовать опцию universal_newlines
и иметь Python автоматически декодирует его для вас:
netshcmd = subprocess.Popen(
'netsh wlan stop hostednetwork',
shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE,
universal_newlines=True)
От Frequently Used Arguments documentation section:
If universal_newlines is True
, эти файловые объекты будут открываться как текстовые потоки в универсальном режиме новой строки, используя кодировку, возвращаемую locale.getpreferredencoding(False)
. Для stdin
символы окончания строки '\n'
на входе будут преобразованы в разделитель строк по умолчанию os.linesep
. Для stdout
и stderr
все окончания линии на выходе будут преобразованы в '\n'
. Для получения дополнительной информации см. Документацию класса io.TextIOWrapper
, когда аргумент новой строки для его конструктора None
.
Для процесса запуска с помощью оболочки, locale.getpreferredencoding(False)
должен быть точно правильный кодек использовать, как получает информацию о том, что кодирование для использования с того же места, что и другие процессы, такие как netsh
, как предполагается, консультации , locale environment variables.
С universal_newlines=True
, output
будет установлен в строку 'The hosted network stopped. \n\n'; note the newlines at the end. You may want to use
str.strip() `, чтобы удалить лишние пробелы там:
print("Success", output.strip())
Отлично, спасибо! – skutik
'locale.getpreferredencoding (False)' эквивалентно кодовой странице ANSI в Windows, такой как cp1252, но stdout-кодировка может быть кодовой страницей OEM, например cp437 в 'cmd.exe' (запускается' shell = True' в Windows). Я не знаю, какой символ кодирует 'netsh' здесь. – jfs
@ J.F.Sebastian: hrmz, поэтому netsh - это команда Windows, я пропустил это. Я не могу найти информацию о том, какой результат он производит, и о том, как локализовать сообщения. : -/ –