amwww
Не понятно как прочесть вывод консоли subprocess
Для этого сначала надо найти программу консольную, которую ты запускаешь и она выводит на консоль что-то. В консоли есть два канала вывода - stdout и stderr.
Если Popen() запускаешь просто с командой, то вывод этой команды пойдёт на экран. Если же ты передаёшь в Popen() аргумент stdout со значением subprocess.PIPE, то вывод команды по каналу stdout прикрепится к атрибуту stdout внутри объекта Popen(). Если же ты передаёшь в Popen() аргумент stderr со значением subprocess.PIPE, то вывод команды по каналу stderr прикрепится к атрибуту stderr внутри объекта Popen().
После выполнения команды вывод с консоли либо будет на экране, либо будет прикреплён к этим атрибутам внутри объекта, возвращённого из Popen(). Дело в том, что программа может писать как в stdout, так и в stderr в пределах одного выполнения. Поэтому и там и там могут быть записи.
Пример
>>> import subprocess
>>>
>>> p = subprocess.Popen(
... ['cat', '/etc/passwd', 'nothing'],
... stdout=subprocess.PIPE,
... stderr=subprocess.PIPE
... )
>>>
>>> text_from_stdout = p.stdout.read().decode('utf-8')
>>> text_from_stderr = p.stderr.read().decode('utf-8')
>>>
>>> print(text_from_stdout[:20])
root:x:0:0:root:/roo
>>>
>>> print('root' in text_from_stdout)
True
>>> print('take' in text_from_stdout)
False
>>>
>>> print(text_from_stderr[:20])
cat: nothing: No suc
>>> print('such' in text_from_stderr)
True
>>> print('ball' in text_from_stderr)
False
>>>
>>> p
<subprocess.Popen object at 0x7f2140652710>
>>>
>>> subprocess.PIPE
-1
>>>
Здесь файл /etc/passwd существует и программа cat его читает и выводит на свой stdout. Так как в Popen() передан аргумент stdout со значением subprocess.PIPE (которое просто является числовой константой), stdout программы cat присоединяется к атрибуту в объекте p (иначе всё выводилось бы на экран).
Здесь файл nothing не существует и программа cat его не может найти и выводит на свой stderr сообщение об отсутствии файла nothing. Так как в Popen() передан аргумент stderr со значением subprocess.PIPE (которое просто является числовой константой), stderr программы cat присоединяется к атрибуту в объекте p (иначе всё выводилось бы на экран).
И потом мы просто эти байтовые строки превращаем в символьные строки через декодирование в кодировку utf-8.
И после этого мы можем в этих символьных строках искать другие символьные строки.
Строка root есть в выводе программы cat, поэтому root находится в выводе программы cat, сохранённом в переменную.
Строки take нет в выводе программы cat, поэтому take не находится в выводе программы cat, сохранённом в переменную.
Строка such есть в выводе ошибок программы cat, поэтому such находится в выводе программы cat, сохранённом в переменную.
Строки ball нет в выводе ошибок программы cat, поэтому ball не находится в выводе программы cat, сохранённом в переменную.