>>>> import subprocess
>>>> ret = subprocess.getoutput('date')
>>>> ret
>'Sun Mar 30 22:54:37 CDT 2014'
Вы не получите результат, пока процесс не завершится. Если вам нужно вызвать что-то, что может занять много времени, обратитесь к разделу «Конкуренция» главы 11. Поскольку аргументом функции getoutput() является строка, представляющая собой команду оболочки, вы можете включить аргументы, каналы, перенаправление ввода/вывода и т. д.:
>>>> ret = subprocess.getoutput('date — u')
>>>> ret
>'Mon Mar 31 03:55:01 UTC 2014'
Передача строки-отчета команде wc насчитывает одну строку, шесть «слов» и 29 символов:
>>>> ret = subprocess.getoutput('date — u | wc')
>>>> ret
>'·······1·······6······29'
Метод check_output() принимает список команд и аргументов. По умолчанию он возвращает объект типа bytes, а не строки и не использует оболочку:
>>>> ret = subprocess.check_output(['date', '-u'])
>>>> ret
>b'Mon Mar 31 04:01:50 UTC 2014\n'
Чтобы показать статус выхода другой программы, используйте функцию getstatusoutput(), которая возвращает кортеж, содержащий код статуса и результат работы:
>>>> ret = subprocess.getstatusoutput('date')
>>>> ret
>(0, 'Sat Jan 18 21:36:23 CST 2014')
Если вам нужен не результат работы программы, а только код, используйте функцию call():
>>>> ret = subprocess.call('date')
>Sat Jan 18 21:33:11 CST 2014
>>>> ret
>0
(В системах семейства Unix 0 обычно является статусом, сигнализирующим об успехе.)
Эти дата и время были выведены на экран, но не получены нашей программой. Поэтому мы сохраняем код возврата как ret.
Вы можете запускать программы с аргументами двумя способами. Первый заключается в том, чтобы разместить их в одной строке. Для примера возьмем команду date — u, которая выводит на экран дату и время в UTC (о UTC мы поговорим немного позже):
>>>> ret = subprocess.call('date — u', shell=True)
>Tue Jan 21 04:40:04 UTC 2014
Вам нужно использовать значение shell=True, чтобы распознать команду date — u, разбив ее на отдельные строки и, возможно, расширяя любые символы подстановки вроде * (в нашем примере мы их не использовали).
Во втором варианте мы создаем список аргументов, поэтому нам не нужно вызывать оболочку:
>>>> ret = subprocess.call(['date', '-u'])
>Tue Jan 21 04:41:59 UTC 2014