Простой Python. Современный стиль программирования (Любанович) - страница 169

>>>> 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

Создаем процесс с помощью модуля multiprocessing

Вы можете запустить функцию Python как отдельный процесс или даже несколько независимых процессов с помощью модуля multiprocessing. Рассмотрим короткий пример, который не делает ничего полезного. Сохраните его под именем mp.py, а затем запустите его, введя команду python mp.py: