Python windows create process

Содержание
  1. Модуль subprocess в Python, запуск новых процессов.
  2. Константы и флаги OS Windows модуля subprocess в Python.
  3. Содержание:
  4. Константы используемые в помощнике Windows subprocess.STARTUPINFO .
  5. subprocess.STD_INPUT_HANDLE :
  6. subprocess.STD_OUTPUT_HANDLE :
  7. subprocess.STD_ERROR_HANDLE :
  8. subprocess.SW_HIDE :
  9. subprocess.STARTF_USESTDHANDLES :
  10. subprocess.STARTF_USESHOWWINDOW :
  11. subprocess.CREATE_NEW_CONSOLE :
  12. Флаги устанавливаемые в качестве параметра creationflags при создании subprocess.Popen() .
  13. subprocess.CREATE_NEW_PROCESS_GROUP :
  14. subprocess.ABOVE_NORMAL_PRIORITY_CLASS :
  15. subprocess.BELOW_NORMAL_PRIORITY_CLASS :
  16. subprocess.HIGH_PRIORITY_CLASS :
  17. subprocess.IDLE_PRIORITY_CLASS :
  18. subprocess.NORMAL_PRIORITY_CLASS :
  19. subprocess.REALTIME_PRIORITY_CLASS :
  20. subprocess.CREATE_NO_WINDOW :
  21. subprocess.DETACHED_PROCESS :
  22. subprocess.CREATE_DEFAULT_ERROR_MODE :
  23. subprocess.CREATE_BREAKAWAY_FROM_JOB :
  24. Класс Process() модуля multiprocessing в Python.
  25. Создание отдельного процесса, запуск задачи и получение результата выполнения.
  26. Синтаксис:
  27. Параметры:
  28. Возвращаемое значение:
  29. Описание:
  30. Методы объекта Process .
  31. Process.run() :
  32. Process.start() :
  33. Process.join([timeout]) :
  34. Process.name :
  35. Process.is_alive() :
  36. Process.daemon :
  37. Process.pid :
  38. Process.exitcode :
  39. Process.authkey :
  40. Process.sentinel :
  41. Process.terminate() :

Модуль subprocess в Python, запуск новых процессов.

Запуск новых процессов — обычная задача на любом языке программирования и очень распространенная на языке высокого уровня, таком как Python.

Модуль subprocess позволяет создавать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать их коды возврата. Этот модуль предназначен для замены нескольких старых модулей и функций: os.system и os.spawn* .

Рекомендуемый подход к вызову подпроцессов заключается в использовании функции subprocess.run() для всех случаев использования, которые она может обработать. Для более сложных вариантов использования базовый интерфейс subprocess.Popen() можно использовать напрямую.

Функция subprocess.run() была добавлена ​​в Python-3.5. Если необходимо сохранить совместимость с устаревшими версиями API, то смотрите раздел «Устаревшие функции модуля subprocess «.

Внимание! Пользователям и администраторам серверов, которые пишут приложения под linux, рекомендуется обратить внимание на сторонний модуль sh . Модуль sh — это удобная, простая в использовании и полноценная замена встроенного модуля subprocess .

Функция run() модуля subprocess в Python.

Функция run() модуля subprocess запускает команду с аргументами, ждет завершения команды, а затем возвращает экземпляр CompletedProcess() с результатами работы.

Объект CompletedProcess модуля subprocess в Python.

Объект `CompletedProcess()` модуля `subprocess` возвращает значение из `subprocess.run()`, представляющее завершенный процесс.

Перенаправление вывода в модуля subprocess в Python.

В этом разделе представлены специальные значения, которые могут принимать аргументы `stdin`, `stdout` или `stderr` модуля `subprocess`.

Часто используемые параметры модуля subprocess в Python.

Для поддержки широкого спектра вариантов использования функций модуля принимают большое количество необязательных аргументов. Для большинства типичных случаев использования, многие из этих аргументов могут быть безопасно оставлены со значениями по умолчанию.

Класс Popen() модуля subprocess в Python.

Класс Popen() модуля subprocess выполняет дочернюю программу в новом процессе. В POSIX класс использует os.execvp() подобное поведение для выполнения дочерней программы. В Windows класс использует функцию Windows CreateProcess().

Объект Popen модуля subprocess в Python.

При вызове subprocess.Popen() возвращает объект Popen, который имеет методы, описанные ниже.

Класс STARTUPINFO() модуля subprocess в Python.

Класс `STARTUPINFO()` модуля `subprocess` используется в аргументе `startupinfo` при создании `subprocess.Popen()`, через который осуществляется частичная поддержка структуры Windows `STARTUPINFO`.

Исключения модуля subprocess в Python.

В этом разделе представлены исключения, специфичные для модуля `subprocess`.

Константы и флаги OS Windows модуля subprocess в Python.

Модуль `subprocess` предоставляет следующие константы, используемые в помощнике Windows.

Читайте также:  Периодически отключается usb порты windows 10

Константы и флаги OS Windows модуля subprocess в Python.

Содержание:

  • Константы используемые в помощнике Windows subprocess.STARTUPINFO :
    • Константа subprocess.STD_INPUT_HANDLE
    • Константа subprocess.STD_OUTPUT_HANDLE
    • Константа subprocess.STD_ERROR_HANDLE
    • Константа subprocess.SW_HIDE
    • Константа subprocess.STARTF_USESTDHANDLES
    • Константа subprocess.STARTF_USESHOWWINDOW
    • Константа subprocess.CREATE_NEW_CONSOLE
  • Флаги устанавливаемые в качестве параметра creationflags при создании subprocess.Popen() :
    • Флаг subprocess.CREATE_NEW_PROCESS_GROUP
    • Флаг subprocess.ABOVE_NORMAL_PRIORITY_CLASS
    • Флаг subprocess.BELOW_NORMAL_PRIORITY_CLASS
    • Флаг subprocess.HIGH_PRIORITY_CLASS
    • Флаг subprocess.IDLE_PRIORITY_CLASS
    • Флаг subprocess.NORMAL_PRIORITY_CLASS
    • Флаг subprocess.REALTIME_PRIORITY_CLASS
    • Флаг subprocess.CREATE_NO_WINDOW
    • Флаг subprocess.DETACHED_PROCESS
    • Флаг subprocess.CREATE_DEFAULT_ERROR_MODE
    • Флаг subprocess.CREATE_BREAKAWAY_FROM_JOB

Константы используемые в помощнике Windows subprocess.STARTUPINFO .

subprocess.STD_INPUT_HANDLE :

Стандартное устройство ввода. Первоначально это консольный буфер ввода, CONIN$ .

subprocess.STD_OUTPUT_HANDLE :

Стандартное устройство вывода. Изначально это экранный буфер активной консоли, CONOUT$ .

subprocess.STD_ERROR_HANDLE :

Стандартная ошибка устройства. Изначально это экранный буфер активной консоли, CONOUT$ .

subprocess.SW_HIDE :

Скрывает окно. Другое окно будет активировано.

subprocess.STARTF_USESTDHANDLES :

subprocess.STARTF_USESHOWWINDOW :

Указывает, что атрибут STARTUPINFO.wShowWindow содержит дополнительную информацию.

subprocess.CREATE_NEW_CONSOLE :

Новый процесс имеет новую консоль вместо того, чтобы наследовать консоль своего родителя (по умолчанию).

Флаги устанавливаемые в качестве параметра creationflags при создании subprocess.Popen() .

subprocess.CREATE_NEW_PROCESS_GROUP :

Прямой параметр аргумента creationflags указывающий, что будет создана новая группа процессов. Этот флаг необходим для использования os.kill() в подпроцессе.

Этот флаг игнорируется, если указано subprocess.CREATE_NEW_CONSOLE .

subprocess.ABOVE_NORMAL_PRIORITY_CLASS :

Прямой параметр аргумента creationflags указывающий, что новый процесс будет иметь приоритет выше среднего.

subprocess.BELOW_NORMAL_PRIORITY_CLASS :

Прямой параметр аргумента creationflags указывающий, что новый процесс будет иметь приоритет ниже среднего.

subprocess.HIGH_PRIORITY_CLASS :

Прямой параметр аргумента creationflags указывающий, что новый процесс будет иметь высокий приоритет.

subprocess.IDLE_PRIORITY_CLASS :

Прямой параметр аргумента creationflags указывающий, что новый процесс будет иметь простой (самый низкий) приоритет.

subprocess.NORMAL_PRIORITY_CLASS :

Прямой параметр аргумента creationflags указывающий, что новый процесс будет иметь нормальный приоритет. (дефолт)

subprocess.REALTIME_PRIORITY_CLASS :

Прямой параметр аргумента creationflags указывающий, что новый процесс будет иметь приоритет в реальном времени.

Флаг subprocess.REALTIME_PRIORITY_CLASS почти никогда не нужно использовать, потому что это прерывает системные потоки, которые управляют вводом с клавиатуры, вводом с клавиатуры и фоновым сбросом диска.

Этот флаг может быть подходящим для приложений, которые «общаются» непосредственно с оборудованием или выполняют короткие задачи, которые должны иметь ограниченные перерывы.

subprocess.CREATE_NO_WINDOW :

Прямой параметр аргумента creationflags указывающий, что новый процесс не будет создавать окно.

subprocess.DETACHED_PROCESS :

Прямой параметр аргумента creationflags указывающий, что новый процесс не наследует консоль своего родителя. Это значение нельзя использовать с subprocess.CREATE_NEW_CONSOLE .

subprocess.CREATE_DEFAULT_ERROR_MODE :

Прямой параметр аргумента creationflags указывающий, что новый процесс не наследует режим ошибки вызывающего процесса. Вместо этого новый процесс получает режим ошибки по умолчанию.

Этот флаг особенно полезен для многопоточных приложений оболочки, которые работают с отключенными серьезными ошибками.

subprocess.CREATE_BREAKAWAY_FROM_JOB :

Прямой параметр аргумента creationflags указывающий, что новый процесс не связан с заданием.

Класс Process() модуля multiprocessing в Python.

Создание отдельного процесса, запуск задачи и получение результата выполнения.

Синтаксис:

Параметры:

Конструктор всегда следует вызывать с ключевыми аргументами.

  • group=None — не используется модулем,
  • target=None — вызываемый объект (функция),
  • name=None — имя процесса,
  • args=() — аргументы для target ,
  • kwargs=<> — ключевые аргументы для target ,
  • daemon=None — флаг для демонизации процесса.
Читайте также:  Создание помощника для windows

Возвращаемое значение:

Описание:

Класс Process() модуля multiprocessing запускает вызываемый объект target на исполнение, который будет выполняется в отдельном процессе/ядре процессора.

Есть два способа запустить какое либо действие:

  • Передать вызываемый объект (функцию) target в конструктор.
  • Переопределить метод Process.run() в подклассе.

Внимание! Никакие другие методы не должны переопределяться в подклассе (кроме конструктора). Другими словами, можно переопределять только методы __init__() и Process.run() этого класса.

Объект Process имеет эквиваленты всех методов объекта Thread() .

Аргумент group всегда должна быть None ; он существует исключительно для совместимости с классом threading.Thread() .

Аргумент target — это вызываемый объект, который будет вызываться методом Process.run() . По умолчанию это None , что означает, что ничего не вызывается. По умолчанию в вызываемый объект target не передаются его аргументы.

Аргумент name — это имя процесса, подробнее смотрите атрибут Process.name .

Аргумент args — это кортеж аргументов для целевого вызова target . Аргумент kwargs — это словарь ключевых аргументов для целевого вызова target .

Если предоставлен ключевой аргумент daemon , то он устанавливает флаг демона процесса значение True или False . Если daemon=None (по умолчанию), этот флаг будет унаследован от процесса создателя.

Если подкласс переопределяет конструктор класса multiprocessing.Process() , то необходимо вызывать конструктор базового класса Process.__init__() , прежде чем делать что-либо еще с процессом.

Обратите внимание, что методы Process.start() , Process.join() , Process.is_alive() , Process.terminate() и Process.exitcode должны вызываться только процессом, создавшим этот объект процесса.

Методы объекта Process .

Объекты Process представляют собой действия, которые выполняются в отдельном процессе.

Process.run() :

Метод Process.run() представляет активность процесса.

Можно переопределить этот метод в своем подклассе. Стандартный метод Process.run() вызывает вызываемый объект, переданный конструктору в качестве целевого аргумента target , с позиционными и ключевыми аргументами, взятыми из аргументов args и kwargs соответственно.

Метод Thread.run() можно переопределить в пользовательском подклассе. Например:

Process.start() :

Метод Process.start() запускает экземпляр Process в отдельном процессе/ядре процессора.

Этот метод должен быть вызван не более одного раза для каждого объекта процесса. Он организует вызов метода Process.run() объекта в отдельном процессе/ядре процессора.

Дополнительно, смотрите описание этого метода у объекта Thread , примеры кода аналогичны.

Process.join([timeout]) :

Метод Process.join() ждет, пока не завершится процесс.

Если необязательный аргумент timeout=None (по умолчанию), то процесс, из которого вызван этот метод, блокируется до тех пор, пока не завершится процесс, у которого вызван этот метод. Проще говоря, если вызвать метод Process.join() для создаваемых процессов из основного процесса программы, то дальнейшее выполнение программы будет заблокировано, пока созданные процессы не завершаться.

Если тайм-аут timeout является положительным числом, то процесс блокируется не более чем на величину секунд, указанную в timeout . Обратите внимание, что метод возвращает None , если его процесс завершается или если время ожидания метода истекает. Проверьте код выхода процесса Process.exitcode , чтобы определить, завершился ли он.

Читайте также:  Linux mce что это

К процессу можно присоединяться много раз.

Процесс не может присоединиться к самому себе, так как это вызовет взаимоблокировку. Попытка присоединиться к процессу до его запуска является ошибкой.

Дополнительно, смотрите описание этого метода у объекта Thread , примеры кода аналогичны.

Process.name :

Атрибут Process.name это имя процесса и представляет собой строку, которая используется только для идентификации. У имени нет семантики.

Несколько процессов могут иметь одно и то же имя (можно присваивать).

Начальное имя задается конструктором класса. Если в конструктор не передан аргумент name , то имена порожденных процессов будет выглядеть как «Process-N1:N2. Nk», где каждый Nk является N-м потомком своего родителя.

Дополнительно, смотрите описание этого метода у объекта Thread , примеры кода аналогичны.

Process.is_alive() :

Метод Process.is_alive() проверяет, является ли процесс живым.

Грубо говоря, объект процесса является живым с момента вызова метода Process.start() и до завершения порожденного дочернего процесса.

Process.daemon :

Атрибут Process.daemon флаг демона процесса, логическое значение. Этот атрибут должен быть установлен перед вызовом метода Process.start() .

Начальное значение наследуется от процесса создателя.

Когда процесс завершается, он пытается завершить все свои демонические дочерние процессы.

Обратите внимание, что демоническому процессу не разрешается создавать дочерние процессы. Так как если демонический процесс будет прерван выходом из родительского процесса, то демонический процесс оставил бы свои дочерние процессы «сиротами«. Кроме того, это не демоны или службы Unix, это обычные процессы, которые будут завершены (но не присоединены), если завершились не-демонические процессы.

Process.pid :

Атрибут Process.pid возвращает идентификатор процесса. До того, как процесс будет порожден, это будет None .

Process.exitcode :

Атрибут Process.exitcode возвращает код выхода порожденного процесса. Значение будет None , если процесс еще не завершен.

Отрицательное значение -N указывает, что дочерний элемент был прерван сигналом N .

Process.authkey :

Атрибут Process.authkey ключ аутентификации процесса, представляет из себя байтовую строку.

При инициализации модуля multiprocessing , основному процессу присваивается случайная строка с помощью os.urandom() .

Когда создается объект процесса, то он наследует ключ аутентификации своего родительского процесса, хотя это может быть изменено путем установки атрибута authkey в другую байтовую строку.

Process.sentinel :

Атрибут Process.sentinel числовой дескриптор системного объекта, который станет «готовым» по завершении процесса.

Можно использовать это значение, если необходимо дождаться нескольких событий одновременно, используя multiprocessing.connection.wait() . Вообще это проще сделать вызвав метод Process.join() у каждого из создаваемых процессов, результатов которых надо дождаться.

В Windows это дескриптор ОС, который можно использовать с семейством вызовов API WaitForSingleObject и WaitForMultipleObjects . В Unix это файловый дескриптор, который можно использовать с примитивами из модуля select .

Process.terminate() :

Метод Process.terminate() завершает процесс. В Unix это делается с помощью сигнала SIGTERM , в Windows используется TerminateProcess() .

Обратите внимание, что обработчики выхода, предложения tru/finally и т. д. не будут выполняться.

Оцените статью