Модуль subprocessВсем доброго вечера, сегодня мы поговорим немного о модуле
subprocess
:)
Данный модуль предоставляет унифицированный интерфейс для создания дополнительных
процессов с вызовом программ, а также может подключать к стандартным потокам ввода, вывода и вывода об ошибках. Модуль был добавлен в стандартную библиотеку
python
на замену
os.system()
и
os.popen()
.
Для создания
процессов в
subprocess
используются функции
run()
,
call()
,
check_call()
,
check_output()
, а также класс
Popen
.
Сегодня мы расскажем о функциях
call
,
check_call
,
check_output
и
run
, а завтра поговорим о Popen. Они используются, когда требуется запустить программу и дождаться ее выполнения.
call
- вызывается для создания
процесса, ожидает выполнения и возвращает код выполнения (если программа отработала корректно, вернется 0).
check_call
- делает тоже самое только еще и проверяет возвращаемое значение, если код выхода указывает, что произошла ошибка, то функция выбросит исключение
CalledProcessError
.
check_output
- использовалась, когда нужно было захватить вывод запущенного
процесса. Эта функция была нужна, так как потоки ввода и вывода запущенного
процесса через
call
привязывались именно к вводу и выводу данного
процесса, поэтому вывод таким образом захватить не получится.
run
- это функция пришла в python версии 3.5 на замену трем предыдущим и умеет все, что и они и немножко больше (данные три функции были оставлены для обратной совместимости).
run()
возвращает объект
CompletedProcess
, который привязан к результату.
Для захвата вывода
процесса нам нужно передать
capture_output=True
, после чего в аргументах объекта
stdout
и
stderr
будут записаны соответствующие выводы, запущенной программы. Но по умолчанию вывод будет вывод будет в байтах, чтобы получить читабельный текст мы также передаем флаг
text=True
.
Иногда программа ожидает от нас ввода из стандартного потока
stdin
, в этом случае мы можем передать ввод через аргумент
input
.
Для того, чтобы породить исключение в случае получения кода возврата об ошибке мы можем передать флаг
check=True
.
И как бонус у этой функции есть аргумент
timeout
позволяющий передать время, через которое
процесс должен быть принудительно завершен. В случае принудительного завершения будет выброшено исключение
TimeoutExpired
.
#процессы #subprocess