2016-10-16 3 views
2

У меня есть этот код:Как редактировать строку из STDOUT

netshcmd = subprocess.Popen('netsh wlan stop hostednetwork', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 
output, errors = netshcmd.communicate() 
if errors: 
    print("Warrning: ", errors) 
else: 
    print("Success", output) 

и выход заключается в следующем:

Success b'The hosted network stopped. \r\n\r\n' 

Как получить выход, как это «Успех размещаемого сети остановился.»?

ответ

2

Чтение из подпроцесса дает вам 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()) 
+0

Отлично, спасибо! – skutik

+0

'locale.getpreferredencoding (False)' эквивалентно кодовой странице ANSI в Windows, такой как cp1252, но stdout-кодировка может быть кодовой страницей OEM, например cp437 в 'cmd.exe' (запускается' shell = True' в Windows). Я не знаю, какой символ кодирует 'netsh' здесь. – jfs

+0

@ J.F.Sebastian: hrmz, поэтому netsh - это команда Windows, я пропустил это. Я не могу найти информацию о том, какой результат он производит, и о том, как локализовать сообщения. : -/ –

0

То есть байтовой строки. Измените свой код, чтобы сделать это:

netshcmd = subprocess.Popen('netsh wlan stop hostednetwork', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 
output, errors = netshcmd.communicate() 
if errors: 
    print("Warrning: ", errors.decode()) 
else: 
    print("Success", output.decode()) 
+0

Не делайте предположений, что UTF-8 всегда правильно. Явно указать кодек; для внешних процессов, запускаемых через оболочку, было бы хорошим предположением для возвращаемого значения 'locale.getpreferredencoding (False)'. –

+0

Спасибо, Бишах. – skutik

Смежные вопросы