Когда вы запускаете отдельную программу, ваша операционная система создает один
процесс. Он использует системные ресурсы (центральный процессор, память, место
на диске) и структуры данных в ядре операционной системы (файлы и сетевые
288
Глава 10. Системы
соединения, статистика использования и т. д.). Процесс изолирован от других про-
цессов — он не может видеть, что делают другие процессы, или мешать им.
Операционная система отслеживает все запущенные процессы, давая каждому
из них немного времени, а затем переключаясь на другие, для того чтобы справед-
ливо распределять работу и реагировать на действия пользователя. Вы можете
увидеть состояние своих процессов с помощью графического интерфейса вроде
Mac’s Activity Monitor (OS X) или Диспетчера задач в Windows.
Вы также можете получать данные о процессах собственных программ. Модуль
стандартной библиотеки os помогает получить некоторую системную информацию.
Например, следующие функции позволяют получить идентификатор процесса
и текущую рабочую папку запущенного интерпретатора Python:
>>> import os
>>> os.getpid()
76051
>>> os.getcwd()
'/Users/williamlubanovic'
А эти — мои идентификаторы пользователя и группы:
>>> os.getuid()
501
>>> os.getgid()
20
Создаем процесс с помощью модуля subprocess
Все программы, с которыми вы сталкивались до этого момента, представляли собой
отдельные процессы. Вы можете запускать и останавливать остальные существу-
ющие программы с помощью Python, используя модуль subprocess. Если вы хоти-
те просто запустить другую программу в оболочке и получить результат ее работы
(стандартный отчет о работе и отчет об ошибках), используйте функцию getoutput().
В этом примере мы получим результат работы программы date системы Unix:
>>> 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'
Программы и процессы
289
Передача строки-отчета команде wc насчитывает одну строку, шесть «слов»
и 29 символов: