# subprocess.Popen

#### *class* subprocess.Popen ( *args*, *bufsize=-1*, *executable=None*, *stdin=None*, *stdout=None*, *stderr=None*, *preexec\_fn=None*, *close\_fds=True*, *shell=False*, *cwd=None*, *env=None*, *universal\_newlines=None*, *startupinfo=None*, *creationflags=0*, *restore\_signals=True*, *start\_new\_session=False*, *pass\_fds=()*, *\**, *encoding=None*, *errors=None*, *text=None* )

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

***args*** должен быть последовательностью аргументов программы или отдельной строкой или объектом, подобным пути (*path-like object* ). По умолчанию программа для выполнения является первым элементом в ***args***, если args является последовательностью. Если ***args*** является строкой, интерпретация зависит от платформы и описана ниже. См. аргументы ***shell*** и ***executable***, чтобы узнать о дополнительных отличиях от поведения по умолчанию. Если не указано иное, рекомендуется передавать аргументы в виде последовательности.

Пример передачи некоторых аргументов внешней программе в виде последовательности:

```python
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
```

В POSIX, если ***args*** является строкой, строка интерпретируется как имя или путь выполняемой программы. Однако это можно сделать, только если не передать аргументы программе.

{% hint style="info" %}
**Примечание:** Может быть неочевидно, как разбить команду оболочки на последовательность аргументов, особенно в сложных случаях. `shlex.split ()` может проиллюстрировать, как определить правильную токенизацию для ***args***:

```python
>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print(args)
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!
```

Обратите внимание, в частности, что параметры (такие как *-input* ) и аргументы (например, *egg.txt* ), разделенные пробелом в оболочке, помещаются в отдельные элементы списка, в то время как аргументы, требующие кавычек или экранирования обратной косой черты при использовании в оболочке (например, имена файлов, содержащие пробелы или показанную выше команду *echo* ) являются отдельными элементами списка.
{% endhint %}

В Windows, если ***args*** является последовательностью, она будет преобразована в строку способом, описанным в разделе «Преобразование последовательности аргументов в строку в Windows». Это связано с тем, что базовый `CreateProcess ()` работает со строками.

*Изменено в версии 3.6:* параметр ***args*** принимает объект, подобный пути (*path-like object* ), если оболочка имеет значение `False`, и последовательность, содержащую объекты, подобные пути (*path-like object* ), в POSIX.

*Изменено в версии 3.8:* параметр ***args*** принимает объект, подобный пути (*path-like object* ), если оболочка имеет значение `False`, и последовательность, содержащую байты и объекты, подобные пути (*path-like object* ), в Windows.

Аргумент ***shell*** (по умолчанию `False`) указывает, следует ли использовать оболочку в качестве программы для выполнения. Если ***shell*** имеет значение `True`, рекомендуется передавать аргументы в виде строки, а не последовательности.

В POSIX с `shell = True` для оболочки по умолчанию используется `/bin/sh`. Если ***args*** является строкой, строка указывает команду, выполняемую через оболочку. Это означает, что строка должна быть отформатирована точно так же, как при вводе в приглашении оболочки. Это включает, например, кавычки или обратную косую черту, экранирующие имена файлов с пробелами. Если ***args*** представляет собой последовательность, первый элемент определяет командную строку, а любые дополнительные элементы будут обрабатываться как дополнительные аргументы самой оболочки. То есть **Popen** выполняет эквивалент:

```python
Popen(['/bin/sh', '-c', args[0], args[1], ...])
```

В Windows с `shell = True` переменная среды COMSPEC указывает оболочку по умолчанию. Единственный раз, когда вам нужно указать `shell = True` в Windows, - это когда команда, которую вы хотите выполнить, встроена в оболочку (например, dir или copy). `shell = True` не требуется для запуска командного файла или исполняемого файла на основе консоли.

{% hint style="info" %}
**Примечание:** прочтите раздел «Вопросы безопасности» перед использованием `shell = True`.
{% endhint %}

***bufsize*** будет предоставлен в качестве соответствующего аргумента функции open () при создании файловых объектов [stdin](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdin) / [stdout](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdout) / [stderr](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stderr) pipe:

* **0** - означает небуферизованный (чтение и запись являются одним системным вызовом и могут возвращаться коротко)
* **1** - означает буферизацию строки (можно использовать, только если `universal_newlines = True`, т.е. в текстовом режиме)
* любое другое положительное значение означает использование буфера примерно такого размера
* отрицательный ***bufsize*** (по умолчанию) означает, что будет использоваться системное значение по умолчанию io.DEFAULT\_BUFFER\_SIZE

*Изменено в версии 3.3.1:* теперь ***bufsize*** по умолчанию равен **-1**, чтобы по умолчанию включить буферизацию в соответствии с поведением, ожидаемым большинством кода. В версиях, предшествующих Python 3.2.4 и 3.3.1, по умолчанию было неправильно установлено значение 0, которое не буферизовалось и позволяло короткие чтения. Это было непреднамеренно и не соответствовало поведению Python 2, как ожидалось в большинстве программ.

Аргумент ***executable*** указывает программу замены, которую нужно выполнить. Это очень редко нужно. Когда `shell = False`, исполняемый файл заменяет программу на выполнение, указанную в ***args***. Однако исходные аргументы по-прежнему передаются программе. Большинство программ рассматривают программу, указанную аргументом ***args***, как имя команды, которое в таком случае может отличаться от фактически выполняемой программы. В POSIX имя ***args*** становится отображаемым именем исполняемого файла в таких утилитах, как **ps**. Если `shell = True`, в POSIX исполняемый аргумент указывает заменяющую оболочку для значения по умолчанию `/bin/sh`.

*Изменено в версии 3.6:* параметр ***executable*** принимает объект, подобный пути (*path-like object* ), в POSIX.

*Изменено в версии 3.8:* параметр ***executable*** принимает байты и объект, подобный пути (*path-like object* ) в Windows.

[***stdin***](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdin), [***stdout***](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdout) и [***stderr***](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stderr) определяют дескрипторы стандартного ввода, стандартного вывода и стандартного файла ошибок исполняемой программы соответственно. Допустимые значения: [PIPE](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/subprocess.pipe), DEVNULL, существующий дескриптор файла (положительное целое число), существующий файловый объект и `None`. [PIPE](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/subprocess.pipe) указывает, что должен быть создан новый канал для дочернего элемента. DEVNULL указывает, что будет использоваться специальный файл os.devnull. Если по умолчанию установлено значение `None`, перенаправление не произойдет; дескрипторы дочерних файлов будут унаследованы от родительского. Кроме того, ***stderr*** может быть STDOUT, что указывает на то, что данные ***stderr*** из приложений должны быть записаны в тот же дескриптор файла, что и для ***stdout***.

Если для ***preexec\_fn*** задан вызываемый объект, этот объект будет вызываться в дочернем процессе непосредственно перед выполнением дочернего процесса. (Только POSIX)

{% hint style="danger" %}
Параметр ***preexec\_fn*** небезопасно использовать при наличии потоков в вашем приложении. Дочерний процесс может зайти в тупик до вызова exec. Если вы должны его использовать, оставьте это тривиальным! Сведите к минимуму количество вызываемых вами библиотек.
{% endhint %}

{% hint style="info" %}
Если вам нужно изменить среду для дочернего объекта, используйте параметр ***env*** вместо того, чтобы делать это в ***preexec\_fn***. Параметр ***start\_new\_session*** может заменить ранее распространенное использование ***preexec\_fn*** для вызова os.setsid () в дочернем элементе.
{% endhint %}

*Изменено в версии 3.8:* параметр ***preexec\_fn*** больше не поддерживается в субинтерпретаторах. Использование параметра в субинтерпретаторе вызывает ошибку RuntimeError. Новое ограничение может повлиять на приложения, развернутые в mod\_wsgi, uWSGI и других встроенных средах.

Если ***close\_fds*** равно `True`, все файловые дескрипторы, кроме 0, 1 и 2, будут закрыты до выполнения дочернего процесса. В противном случае, когда ***close\_fds*** имеет значение `False`, файловые дескрипторы подчиняются своему наследуемому флагу, как описано в разделе «Наследование файловых дескрипторов».

В Windows, если ***close\_fds*** имеет значение `True`, то дескрипторы не будут унаследованы дочерним процессом, если они явно не переданы в элементе `handle_list` файла STARTUPINFO.lpAttributeList или стандартным перенаправлением дескрипторов.

*Изменено в версии 3.2:* значение по умолчанию для ***close\_fds*** было изменено с `False` на то, что описано выше.

*Изменено в версии 3.7:* в Windows значение по умолчанию для ***close\_fds*** было изменено с `False` на `True` при перенаправлении стандартных дескрипторов. Теперь можно установить ***close\_fds*** в `True` при перенаправлении стандартных дескрипторов.

***pass\_fds*** - это необязательная последовательность файловых дескрипторов, которые должны оставаться открытыми между родительским и дочерним. Предоставление любого ***pass\_fds*** заставляет ***close\_fds*** быть `True`. (Только POSIX)

*Изменено в версии 3.2:* Добавлен параметр ***pass\_fds***.

Если ***cwd*** не равно `None`, функция изменяет текущий рабочий каталог на ***cwd*** перед выполнением дочернего элемента. ***cwd*** может быть строкой, байтами или объектом, подобным пути (*path-like object* ). В частности, функция ищет исполняемый файл (или первый элемент в ***args***) относительно ***cwd***, если путь к исполняемому файлу является относительным.

*Изменено в версии 3.6:* параметр ***cwd*** принимает объект, подобный пути (*path-like object* ), в POSIX.

*Изменено в версии 3.7:* параметр ***cwd*** принимает в Windows объект, похожий на путь (*path-like object* ).

*Изменено в версии 3.8:* параметр ***cwd*** принимает байтовый объект в Windows.

Если ***restore\_signals*** имеет значение `True` (по умолчанию), все сигналы, которые Python установил в SIG\_IGN, восстанавливаются в SIG\_DFL в дочернем процессе перед exec. В настоящее время это включает сигналы SIGPIPE, SIGXFZ и SIGXFSZ. (Только POSIX)

*Изменено в версии 3.2:* добавлено ***restore\_signals***.

Если ***start\_new\_session*** равно `True`, системный вызов setsid () будет выполнен в дочернем процессе до выполнения подпроцесса. (Только POSIX)

*Изменено в версии 3.2:* добавлен ***start\_new\_session***.

Если ***env*** не равно `None`, это должно быть отображение, определяющее переменные среды для нового процесса; они используются вместо поведения по умолчанию при наследовании среды текущего процесса.

{% hint style="info" %}
Если указано, ***env*** должен предоставить все переменные, необходимые для выполнения программы. В Windows для запуска параллельной сборки указанный ***env*** должен включать действительный SystemRoot.
{% endhint %}

Если указаны ***encoding*** или ***errors***, либо ***text*** имеет значение `True`, файловые объекты [***stdin***](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdin), [***stdout***](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdout) и [***stderr***](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stderr) открываются в текстовом режиме с указанной ***encoding*** и ***errors***, как описано выше в разделе «Часто используемые аргументы». Аргумент ***universal\_newlines*** эквивалентен тексту и предоставляется для обратной совместимости. По умолчанию файловые объекты открываются в двоичном режиме.

*Новое в версии 3.6:* добавлены ***encoding*** и ***errors***.

*Новое в версии 3.7:* ***text*** был добавлен как более читаемый псевдоним для ***universal\_newlines***.

Если задано, ***startupinfo*** будет объектом STARTUPINFO, который передается базовой функции `CreateProcess`. ***creationflags***, если задан, может быть одним или несколькими из следующих флагов:

> * CREATE\_NEW\_CONSOLE
> * CREATE\_NEW\_PROCESS\_GROUP
> * ABOVE\_NORMAL\_PRIORITY\_CLASS
> * BELOW\_NORMAL\_PRIORITY\_CLASS
> * HIGH\_PRIORITY\_CLASS
> * IDLE\_PRIORITY\_CLASS
> * NORMAL\_PRIORITY\_CLASS
> * REALTIME\_PRIORITY\_CLASS
> * CREATE\_NO\_WINDOW
> * DETACHED\_PROCESS
> * CREATE\_DEFAULT\_ERROR\_MODE
> * CREATE\_BREAKAWAY\_FROM\_JOB

Объекты **Popen** поддерживаются как диспетчеры контекста с помощью оператора with: при выходе стандартные файловые дескрипторы закрываются, и процесс ожидает.

```python
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
```

**Popen** и другие функции в этом модуле, которые его используют, вызывают события аудита `subprocess.Popen` с аргументами `executable`, `args`, `cwd` и `env`. Значение ***args*** может быть одной строкой или списком строк, в зависимости от платформы.

*Изменено в версии 3.2:* Добавлена поддержка диспетчера контекста.

*Изменено в версии 3.6:* деструктор **Popen** теперь выдает предупреждение ResourceWarning, если дочерний процесс все еще выполняется.

*Изменено в версии 3.8:* **Popen** может использовать os.posix\_spawn () в некоторых случаях для повышения производительности. В подсистеме Windows для Linux и пользовательской эмуляции QEMU конструктор **Popen**, использующий os.posix\_spawn (), больше не генерирует исключение при таких ошибках, как отсутствие программы, но дочерний процесс завершается с ошибкой с ненулевым кодом возврата.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/subprocess.popen.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
