> For the complete documentation index, see [llms.txt](https://treasuremaster.gitbook.io/python-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://treasuremaster.gitbook.io/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/subprocess.popen.md).

# 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](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdin.md) / [stdout](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdout.md) / [stderr](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stderr.md) 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***](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdin.md), [***stdout***](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdout.md) и [***stderr***](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stderr.md) определяют дескрипторы стандартного ввода, стандартного вывода и стандартного файла ошибок исполняемой программы соответственно. Допустимые значения: [PIPE](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/subprocess.pipe.md), DEVNULL, существующий дескриптор файла (положительное целое число), существующий файловый объект и `None`. [PIPE](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/subprocess.pipe.md) указывает, что должен быть создан новый канал для дочернего элемента. 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***](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdin.md), [***stdout***](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stdout.md) и [***stderr***](/python-docs/moduli-standartnoi-biblioteki-1/parallelnoe-vypolnenie/subprocess/popen.stderr.md) открываются в текстовом режиме с указанной ***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 (), больше не генерирует исключение при таких ошибках, как отсутствие программы, но дочерний процесс завершается с ошибкой с ненулевым кодом возврата.
