Документация Python неофициальный перевод

subprocess.md

1059 строк · 108.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.12/library/subprocess.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `subprocess` – Управление подпроцессами89**Исходный код:** [Lib/subprocess.py](https://python-all.ru/src/3.12/Lib/subprocess.py)1011---1213Модуль [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess) позволяет создавать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать их коды возврата. Этот модуль призван заменить несколько более старых модулей и функций:1415```python16os.system17os.spawn*18```1920Информация о том, как с помощью модуля [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess) заменить эти модули и функции, приведена в следующих разделах.2122> **См. также**23>24> [**PEP 324**](https://python-all.ru/3.12/library/subprocess.html) – PEP, предлагающий модуль подпроцесса2526[Доступность](https://python-all.ru/3.12/library/intro.html#availability): not Emscripten, not WASI.2728Этот модуль не работает или недоступен на платформах WebAssembly `wasm32-emscripten` и `wasm32-wasi`. См. [платформы WebAssembly](https://python-all.ru/3.12/library/intro.html#wasm-availability) для получения дополнительной информации.2930## Использование модуля [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess)3132Рекомендуемый способ вызова подпроцессов – использовать функцию [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) для всех случаев, с которыми она может справиться. Для более сложных случаев можно напрямую использовать нижележащий интерфейс [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen).3334#### `subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)`3536Выполняет команду, описанную аргументом *args*. Ожидает завершения команды и возвращает экземпляр [`CompletedProcess`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CompletedProcess).3738Приведённые выше аргументы – лишь самые распространённые; они описаны ниже в разделе [Часто используемые аргументы](https://python-all.ru/3.12/library/subprocess.html#frequently-used-arguments) (отсюда использование синтаксиса только ключевых слов в сокращённой сигнатуре). Полная сигнатура функции в основном совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) – большинство аргументов этой функции передаются этому интерфейсу. (*timeout*, *input*, *check* и *capture\_output* – не передаются.)3940Если *capture\_output* истинно, stdout и stderr будут захватываться. При использовании автоматически создаётся внутренний объект [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen), в котором *stdout* и *stderr* оба установлены в [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE). Аргументы *stdout* и *stderr* не могут быть указаны одновременно с *capture\_output*. Если требуется захватить и объединить оба потока в один, установите *stdout* в [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE) и *stderr* в [`STDOUT`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STDOUT) вместо использования *capture\_output*.4142Время ожидания *timeout* можно указать в секундах; оно внутренне передаётся в [`Popen.communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate). Если время ожидания истекает, дочерний процесс завершается и ожидается. Исключение [`TimeoutExpired`](https://python-all.ru/3.12/library/subprocess.html#subprocess.TimeoutExpired) будет возбуждено повторно после завершения дочернего процесса. Начальное создание процесса само по себе не может быть прервано во многих API платформ, поэтому нет гарантии, что исключение по таймауту будет получено раньше, чем через время, необходимое для создания процесса.4344Аргумент *input* передаётся в [`Popen.communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate) и, таким образом, в stdin подпроцесса. При использовании он должен быть последовательностью байтов или строкой, если указаны *encoding* или *errors*, либо если *text* истинно. При использовании автоматически создаётся внутренний объект [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen), в котором *stdin* установлен в [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), и аргумент *stdin* также не может использоваться.4546Если *check* истинно и процесс завершается с ненулевым кодом возврата, будет возбуждено исключение [`CalledProcessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError). Атрибуты этого исключения содержат аргументы, код возврата, а также stdout и stderr, если они были захвачены.4748Если указаны *encoding* или *errors*, либо *text* истинно, файловые объекты для stdin, stdout и stderr открываются в текстовом режиме с использованием указанных *encoding* и *errors* или значения по умолчанию [`io.TextIOWrapper`](https://python-all.ru/3.12/library/io.html#io.TextIOWrapper). Аргумент *universal\_newlines* эквивалентен *text* и предусмотрен для обратной совместимости. По умолчанию файловые объекты открываются в двоичном режиме.4950Если *env* не равно `None`, оно должно быть отображением (mapping), определяющим переменные окружения для нового процесса; они используются вместо поведения по умолчанию, заключающегося в наследовании окружения текущего процесса. Оно передаётся непосредственно в [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen). Это отображение может быть строки в строки на любой платформе или байты в байты на платформах POSIX, аналогично [`os.environ`](https://python-all.ru/3.12/library/os.html#os.environ) или [`os.environb`](https://python-all.ru/3.12/library/os.html#os.environb).5152Примеры:5354```python55>>> subprocess.run(["ls", "-l"])  # не захватывает вывод56CompletedProcess(args=['ls', '-l'], returncode=0)5758>>> subprocess.run("exit 1", shell=True, check=True)59Traceback (most recent call last):60  ...61subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 16263>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)64CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,65stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')66```6768Добавлено в версии 3.5.6970Изменено в версии 3.6: Добавлены параметры *encoding* и *errors*7172Изменено в версии 3.7: Добавлен параметр *text* как более понятный псевдоним *universal\_newlines*. Добавлен параметр *capture\_output*.7374Изменено в версии 3.12: Изменён порядок поиска в командной оболочке Windows для `shell=True`. Текущий каталог и `%PATH%` заменены на `%COMSPEC%` и `%SystemRoot%\System32\cmd.exe`. В результате подбросить вредоносную программу с именем `cmd.exe` в текущий каталог больше не работает.7576#### `class subprocess.CompletedProcess`7778Возвращаемое значение [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run), представляющее завершившийся процесс.7980#### `args`8182Аргументы, использованные для запуска процесса. Это может быть список или строка.8384#### `returncode`8586Статус выхода дочернего процесса. Обычно статус выхода 0 указывает на успешное завершение.8788Отрицательное значение `-N` указывает, что дочерний процесс был завершён сигналом `N` (только POSIX).8990#### `stdout`9192Захваченный stdout дочернего процесса. Последовательность байтов или строка, если [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) был вызван с указанием encoding, errors или text=True. `None`, если stdout не захватывался.9394Если процесс был запущен с `stderr=subprocess.STDOUT`, stdout и stderr будут объединены в этом атрибуте, а [`stderr`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CompletedProcess.stderr) будет равно `None`.9596#### `stderr`9798Захваченный stderr дочернего процесса. Последовательность байтов или строка, если [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) был вызван с указанием encoding, errors или text=True. `None`, если stderr не захватывался.99100#### `check_returncode()`101102Если [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CompletedProcess.returncode) ненулевой, возбуждается [`CalledProcessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError).103104Добавлено в версии 3.5.105106#### `subprocess.DEVNULL`107108Специальное значение, которое можно использовать в качестве аргумента *stdin*, *stdout* или *stderr* для [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) и указывает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.12/library/os.html#os.devnull).109110Добавлено в версии 3.3.111112#### `subprocess.PIPE`113114Специальное значение, которое можно использовать в качестве аргумента *stdin*, *stdout* или *stderr* для [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) и указывает, что должен быть открыт канал (pipe) для стандартного потока. Наиболее полезен с [`Popen.communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate).115116#### `subprocess.STDOUT`117118Специальное значение, которое можно использовать в качестве аргумента *stderr* для [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) и указывает, что стандартный поток ошибок должен направляться в тот же дескриптор, что и стандартный вывод.119120#### `exception subprocess.SubprocessError`121122Базовый класс для всех остальных исключений из этого модуля.123124Добавлено в версии 3.3.125126#### `exception subprocess.TimeoutExpired`127128Подкласс [`SubprocessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.SubprocessError), возбуждается при истечении тайм-аута во время ожидания дочернего процесса.129130#### `cmd`131132Команда, которая использовалась для запуска дочернего процесса.133134#### `timeout`135136Тайм-аут в секундах.137138#### `output`139140Вывод дочернего процесса, если он был захвачен с помощью [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) или [`check_output()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.check_output). В противном случае `None`. Это всегда [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes), когда какой-либо вывод был захвачен, независимо от настройки `text=True`. Он может оставаться `None` вместо `b''`, когда вывод не наблюдался.141142#### `stdout`143144Псевдоним для output, для симметрии с [`stderr`](https://python-all.ru/3.12/library/subprocess.html#subprocess.TimeoutExpired.stderr).145146#### `stderr`147148Вывод stderr дочернего процесса, если он был захвачен с помощью [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run). В противном случае `None`. Это всегда [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes), когда вывод stderr был захвачен, независимо от настройки `text=True`. Он может оставаться `None` вместо `b''`, когда вывод stderr не наблюдался.149150Добавлено в версии 3.3.151152Изменено в версии 3.5: добавлены атрибуты *stdout* и *stderr*153154#### `exception subprocess.CalledProcessError`155156Подкласс [`SubprocessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.SubprocessError), возбуждается, когда процесс, запущенный с помощью [`check_call()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.check_call), [`check_output()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.check_output) или [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) (с `check=True`), возвращает ненулевой статус выхода.157158#### `returncode`159160Статус выхода дочернего процесса. Если процесс завершился из-за сигнала, это будет отрицательный номер сигнала.161162#### `cmd`163164Команда, которая использовалась для запуска дочернего процесса.165166#### `output`167168Вывод дочернего процесса, если он был захвачен с помощью [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) или [`check_output()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.check_output). В противном случае `None`.169170#### `stdout`171172Псевдоним для output, для симметрии с [`stderr`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError.stderr).173174#### `stderr`175176Вывод stderr дочернего процесса, если он был захвачен с помощью [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run). В противном случае – `None`.177178Изменено в версии 3.5: добавлены атрибуты *stdout* и *stderr*179180### Часто используемые аргументы181182Чтобы поддерживать широкий спектр сценариев использования, конструктор [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) (и удобные функции) принимает большое количество необязательных аргументов. Для большинства типичных случаев многие из этих аргументов можно безопасно оставить со значениями по умолчанию. Наиболее часто требуемые аргументы:183184> *args* обязателен для всех вызовов и должен быть строкой или последовательностью аргументов программы. Как правило, предпочтительнее передавать последовательность аргументов, так как это позволяет модулю позаботиться о любом необходимом экранировании и кавычках аргументов (например, для пробелов в именах файлов). Если передаётся одна строка, то либо *shell* должен быть [`True`](https://python-all.ru/3.12/library/constants.html#True) (см. ниже), либо строка должна просто указывать имя программы для запуска без указания каких-либо аргументов.185>186> *stdin*, *stdout* и *stderr* задают стандартный ввод, стандартный вывод и стандартный вывод ошибок выполняемой программы соответственно. Допустимые значения: `None`, [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), [`DEVNULL`](https://python-all.ru/3.12/library/subprocess.html#subprocess.DEVNULL), существующий файловый дескриптор (положительное целое число) и существующий [файловый объект](https://python-all.ru/3.12/glossary.html#term-file-object) с правильным файловым дескриптором. При настройках по умолчанию (`None`) перенаправление не происходит. [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE) означает, что должен быть создан новый канал для дочернего процесса. [`DEVNULL`](https://python-all.ru/3.12/library/subprocess.html#subprocess.DEVNULL) указывает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.12/library/os.html#os.devnull). Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr дочернего процесса должны быть перехвачены в тот же файловый дескриптор, что и для *stdout*.187>188> Если указаны *encoding* или *errors*, или *text* (также известный как *universal\_newlines*) имеет значение true, файловые объекты *stdin*, *stdout* и *stderr* будут открыты в текстовом режиме с использованием *encoding* и *errors*, указанных в вызове, или значений по умолчанию для [`io.TextIOWrapper`](https://python-all.ru/3.12/library/io.html#io.TextIOWrapper).189>190> Для *stdin* символы конца строки `'\n'` во входных данных будут преобразованы в стандартный разделитель строк [`os.linesep`](https://python-all.ru/3.12/library/os.html#os.linesep). Для *stdout* и *stderr* все концы строк в выводе будут преобразованы в `'\n'`. Подробнее см. документацию класса [`io.TextIOWrapper`](https://python-all.ru/3.12/library/io.html#io.TextIOWrapper), когда аргумент *newline* его конструктора равен `None`.191>192> Если текстовый режим не используется, *stdin*, *stdout* и *stderr* будут открыты как двоичные потоки. Никакого преобразования кодировки или концов строк не выполняется.193>194> Изменено в версии 3.6: Добавлены параметры *encoding* и *errors*.195>196> Изменено в версии 3.7: Добавлен параметр *text* как псевдоним для *universal\_newlines*.197>198> > **Примечание**199> >200> > Атрибут newlines файловых объектов [`Popen.stdin`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.stdin), [`Popen.stdout`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.stdout) и [`Popen.stderr`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.stderr) не обновляется методом [`Popen.communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate).201>202> Если *shell* равен `True`, указанная команда будет выполняться через оболочку. Это может быть полезно, если вы используете Python в основном из-за улучшенного управления потоком, которое он предлагает по сравнению с большинством системных оболочек, и при этом хотите удобного доступа к другим возможностям оболочки, таким как конвейеры, подстановка имен файлов, подстановка переменных окружения и раскрытие `~` в домашний каталог пользователя. Однако имейте в виду, что сам Python предлагает реализации многих функций, подобных оболочке (в частности, [`glob`](https://python-all.ru/3.12/library/glob.html#module-glob), [`fnmatch`](https://python-all.ru/3.12/library/fnmatch.html#module-fnmatch), [`os.walk()`](https://python-all.ru/3.12/library/os.html#os.walk), [`os.path.expandvars()`](https://python-all.ru/3.12/library/os.path.html#os.path.expandvars), [`os.path.expanduser()`](https://python-all.ru/3.12/library/os.path.html#os.path.expanduser) и [`shutil`](https://python-all.ru/3.12/library/shutil.html#module-shutil)).203>204> Изменено в версии 3.3: Когда *universal\_newlines* имеет значение `True`, класс использует кодировку [`locale.getpreferredencoding(False)`](https://python-all.ru/3.12/library/locale.html#locale.getpreferredencoding) вместо `locale.getpreferredencoding()`. Подробнее об этом изменении см. в документации класса [`io.TextIOWrapper`](https://python-all.ru/3.12/library/io.html#io.TextIOWrapper).205>206> > **Примечание**207> >208> > Перед использованием `shell=True` прочтите раздел [Рекомендации по безопасности](https://python-all.ru/3.12/library/subprocess.html#security-considerations).209210Эти опции, как и все остальные, подробно описаны в документации конструктора [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen).211212### Конструктор Popen213214Создание и управление базовыми процессами в этом модуле осуществляется классом [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen). Он предоставляет большую гибкость, чтобы разработчики могли обрабатывать менее распространённые случаи, не охваченные удобными функциями.215216#### `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=(), *, group=None, extra_groups=None, user=None, umask=-1, encoding=None, errors=None, text=None, pipesize=-1, process_group=None)`217218Запускает дочернюю программу в новом процессе. На POSIX класс использует поведение, подобное [`os.execvpe()`](https://python-all.ru/3.12/library/os.html#os.execvpe), для выполнения дочерней программы. На Windows класс использует функцию Windows `CreateProcess()`. Аргументы [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) описаны ниже.219220*args* должен быть последовательностью аргументов программы или одной строкой или [объектом, подобным пути](https://python-all.ru/3.12/glossary.html#term-path-like-object). По умолчанию программа для выполнения – это первый элемент в *args*, если *args* является последовательностью. Если *args* – строка, интерпретация зависит от платформы и описана ниже. См. аргументы *shell* и *executable* для дополнительных отличий от поведения по умолчанию. Если не указано иное, рекомендуется передавать *args* в виде последовательности.221222> **Предупреждение**223>224> Для максимальной надёжности используйте полный путь к исполняемому файлу. Чтобы найти программу по короткому имени на `PATH`, используйте [`shutil.which()`](https://python-all.ru/3.12/library/shutil.html#shutil.which). На всех платформах передача [`sys.executable`](https://python-all.ru/3.12/library/sys.html#sys.executable) является рекомендуемым способом запуска текущего интерпретатора Python снова и используйте формат командной строки `-m` для запуска установленного модуля.225>226> Разрешение пути *executable* (или первого элемента *args*) зависит от платформы. Для POSIX см. [`os.execvpe()`](https://python-all.ru/3.12/library/os.html#os.execvpe) и учтите, что при разрешении или поиске пути к исполняемому файлу *cwd* переопределяет текущий рабочий каталог, а *env* может переопределять переменную окружения `PATH`. Для Windows см. документацию параметров `lpApplicationName` и `lpCommandLine` WinAPI `CreateProcess` и учтите, что при разрешении или поиске пути к исполняемому файлу с помощью `shell=False`, *cwd* не переопределяет текущий рабочий каталог, а *env* не может переопределить переменную окружения `PATH`. Использование полного пути позволяет избежать всех этих различий.227228Пример передачи некоторых аргументов внешней программе в виде последовательности:229230```python231Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])232```233234На POSIX, если *args* – строка, она интерпретируется как имя или путь к программе для запуска. Однако это можно сделать только в том случае, если программе не передаются аргументы.235236> **Примечание**237>238> Может быть неочевидно, как разбить команду оболочки на последовательность аргументов, особенно в сложных случаях. [`shlex.split()`](https://python-all.ru/3.12/library/shlex.html#shlex.split) может показать, как определить правильную токенизацию для *args*:239>240> ```python241> >>> import shlex, subprocess242> >>> command_line = input()243> /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"244> >>> args = shlex.split(command_line)245> >>> print(args)246> ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]247> >>> p = subprocess.Popen(args) # Успешно!248> ```249>250> Обратите внимание, что опции (такие как *-input*) и аргументы (такие как *eggs.txt*), разделённые пробелами в оболочке, помещаются в отдельные элементы списка, в то время как аргументы, требующие кавычек или обратной косой черты в оболочке (например, имена файлов, содержащие пробелы, или команда *echo*, показанная выше), являются отдельными элементами списка.251252На Windows, если *args* – последовательность, она будет преобразована в строку способом, описанным в разделе [Преобразование последовательности аргументов в строку на Windows](https://python-all.ru/3.12/library/subprocess.html#converting-argument-sequence). Это связано с тем, что базовая функция `CreateProcess()` работает со строками.253254Изменено в версии 3.6: Параметр *args* принимает [объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object), если *shell* равен `False`, а также последовательность, содержащую объекты, подобные пути, на POSIX.255256Изменено в версии 3.8: Параметр *args* принимает [объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object), если *shell* равен `False`, а также последовательность, содержащую байты и объекты, подобные пути, на Windows.257258Аргумент *shell* (по умолчанию `False`) определяет, нужно ли использовать оболочку в качестве исполняемой программы. Если *shell* равен `True`, рекомендуется передавать *args* в виде строки, а не последовательности.259260На POSIX с `shell=True` оболочка по умолчанию – `/bin/sh`. Если *args* – строка, она задаёт команду для выполнения через оболочку. Это означает, что строка должна быть оформлена точно так же, как если бы она была введена в командной строке оболочки. Например, это включает экранирование кавычками или обратной косой черты имён файлов с пробелами. Если *args* – последовательность, первый элемент задаёт строку команды, а все остальные элементы рассматриваются как дополнительные аргументы для самой оболочки. Иначе говоря, [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) эквивалентно:261262```python263Popen(['/bin/sh', '-c', args[0], args[1], ...])264```265266На Windows с `shell=True` переменная окружения `COMSPEC` задаёт оболочку по умолчанию. Указывать `shell=True` в Windows нужно только тогда, когда команда, которую требуется выполнить, встроена в оболочку (например, **dir** или **copy**). Для запуска пакетного файла или консольного исполняемого файла `shell=True` не требуется.267268> **Примечание**269>270> Перед использованием `shell=True` прочтите раздел [Рекомендации по безопасности](https://python-all.ru/3.12/library/subprocess.html#security-considerations).271272*bufsize* будет передан как соответствующий аргумент функции [`open()`](https://python-all.ru/3.12/library/functions.html#open) при создании файловых объектов каналов stdin/stdout/stderr:273274- `0` означает без буферизации (чтение и запись – один системный вызов, могут возвращать меньше данных, чем запрошено)275- `1` означает буферизацию по строкам (работает только если `text=True` или `universal_newlines=True`)276- любое другое положительное значение означает использование буфера примерно такого размера277- отрицательное значение bufsize (по умолчанию) означает, что будет использовано системное значение по умолчанию io.DEFAULT\_BUFFER\_SIZE.278279Изменено в версии 3.3.1: *bufsize* теперь по умолчанию равен -1, чтобы включить буферизацию по умолчанию, как того ожидает большинство кода. В версиях до Python 3.2.4 и 3.3.1 по умолчанию ошибочно использовалось `0`, что означало отсутствие буферизации и допускало короткие чтения. Это было непреднамеренно и не соответствовало поведению Python 2, как ожидал большинство кода.280281Аргумент *executable* задаёт альтернативную программу для выполнения. Он требуется очень редко. Если `shell=False`, *executable* заменяет программу, указанную в *args*. Однако исходное значение *args* всё равно передаётся программе. Большинство программ воспринимают программу, указанную через *args*, как имя команды, которое может отличаться от фактически выполняемой программы. На POSIX имя из *args* становится отображаемым именем исполняемого файла в утилитах вроде **ps**. Если `shell=True`, на POSIX аргумент *executable* задаёт альтернативную оболочку вместо `/bin/sh`.282283Изменено в версии 3.6: Параметр *executable* принимает [объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object) на POSIX.284285Изменено в версии 3.8: Параметр *executable* принимает bytes и [объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object) на Windows.286287Изменено в версии 3.12: Изменён порядок поиска в командной оболочке Windows для `shell=True`. Текущий каталог и `%PATH%` заменены на `%COMSPEC%` и `%SystemRoot%\System32\cmd.exe`. В результате подбросить вредоносную программу с именем `cmd.exe` в текущий каталог больше не работает.288289*stdin*, *stdout* и *stderr* задают дескрипторы файлов стандартного ввода, стандартного вывода и стандартного вывода ошибок выполняемой программы соответственно. Допустимые значения: `None`, [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), [`DEVNULL`](https://python-all.ru/3.12/library/subprocess.html#subprocess.DEVNULL), существующий файловый дескриптор (положительное целое число) и существующий [файловый объект](https://python-all.ru/3.12/glossary.html#term-file-object) с корректным файловым дескриптором. При стандартных настройках `None` перенаправление не выполняется. [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE) означает, что следует создать новый канал к дочернему процессу. [`DEVNULL`](https://python-all.ru/3.12/library/subprocess.html#subprocess.DEVNULL) означает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.12/library/os.html#os.devnull). Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr от приложений должны быть захвачены в тот же дескриптор, что и для *stdout*.290291Если *preexec\_fn* задан как вызываемый объект, этот объект будет вызван в дочернем процессе непосредственно перед его выполнением. (Только POSIX)292293> **Предупреждение**294>295> Параметр *preexec\_fn* НЕ БЕЗОПАСЕН при использовании в приложении с потоками. Дочерний процесс может войти в взаимоблокировку до вызова exec.296297> **Примечание**298>299> Если требуется изменить окружение для дочернего процесса, используйте параметр *env*, а не *preexec\_fn*. Параметры *start\_new\_session* и *process\_group* должны заменить код, использующий *preexec\_fn* для вызова [`os.setsid()`](https://python-all.ru/3.12/library/os.html#os.setsid) или [`os.setpgid()`](https://python-all.ru/3.12/library/os.html#os.setpgid) в дочернем процессе.300301Изменено в версии 3.8: Параметр *preexec\_fn* больше не поддерживается в подынтерпретаторах. Использование этого параметра в подынтерпретаторе вызывает [`RuntimeError`](https://python-all.ru/3.12/library/exceptions.html#RuntimeError). Новое ограничение может затронуть приложения, развёрнутые в mod\_wsgi, uWSGI и других встраиваемых средах.302303Если *close\_fds* равен true, все файловые дескрипторы, кроме `0`, `1` и `2`, будут закрыты перед выполнением дочернего процесса. В противном случае, когда *close\_fds* равен false, дескрипторы подчиняются флагу наследуемости, как описано в [Наследование файловых дескрипторов](https://python-all.ru/3.12/library/os.html#fd-inheritance).304305На Windows, если *close\_fds* равен true, дочерний процесс не унаследует никакие дескрипторы, если они явно не переданы через элемент `handle_list` в [`STARTUPINFO.lpAttributeList`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.lpAttributeList) или через перенаправление стандартных дескрипторов.306307Изменено в версии 3.2: Значение по умолчанию для *close\_fds* было изменено с [`False`](https://python-all.ru/3.12/library/constants.html#False) на то, что описано выше.308309Изменено в версии 3.7: На Windows значение по умолчанию для *close\_fds* было изменено с [`False`](https://python-all.ru/3.12/library/constants.html#False) на [`True`](https://python-all.ru/3.12/library/constants.html#True) при перенаправлении стандартных дескрипторов. Теперь можно установить *close\_fds* в [`True`](https://python-all.ru/3.12/library/constants.html#True) при перенаправлении стандартных дескрипторов.310311*pass\_fds* – необязательная последовательность файловых дескрипторов, которые должны оставаться открытыми между родительским и дочерним процессами. Указание любого *pass\_fds* принуждает *close\_fds* принимать значение [`True`](https://python-all.ru/3.12/library/constants.html#True). (Только POSIX)312313Изменено в версии 3.2: Добавлен параметр *pass\_fds*.314315Если *cwd* не равен `None`, функция меняет рабочий каталог на *cwd* перед выполнением дочернего процесса. *cwd* может быть строкой, bytes или [подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object) объектом. На POSIX функция ищет *executable* (или первый элемент в *args*) относительно *cwd*, если путь к исполняемому файлу является относительным.316317Изменено в версии 3.6: Параметр *cwd* принимает [объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object) на POSIX.318319Изменено в версии 3.7: Параметр *cwd* принимает [объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object) на Windows.320321Изменено в версии 3.8: Параметр *cwd* принимает объект bytes на Windows.322323Если *restore\_signals* равен true (по умолчанию), все сигналы, которые Python установил в SIG\_IGN, восстанавливаются в SIG\_DFL в дочернем процессе перед exec. В настоящее время это включает сигналы SIGPIPE, SIGXFZ и SIGXFSZ. (Только POSIX)324325Изменено в версии 3.2: Добавлен *restore\_signals*.326327Если *start\_new\_session* равен true, в дочернем процессе будет выполнен системный вызов `setsid()` перед выполнением подпроцесса.328329[Доступность](https://python-all.ru/3.12/library/intro.html#availability): POSIX330331Изменено в версии 3.2: добавлен *start\_new\_session*.332333Если *process\_group* – неотрицательное целое число, системный вызов `setpgid(0, value)` будет выполнен в дочернем процессе перед запуском подпроцесса.334335[Доступность](https://python-all.ru/3.12/library/intro.html#availability): POSIX336337Изменено в версии 3.11: добавлен *process\_group*.338339Если *group* не равен `None`, системный вызов setregid() будет выполнен в дочернем процессе перед запуском подпроцесса. Если переданное значение – строка, она будет найдена через [`grp.getgrnam()`](https://python-all.ru/3.12/library/grp.html#grp.getgrnam) и будет использовано значение из `gr_gid`. Если значение – целое число, оно будет передано как есть (только POSIX).340341[Доступность](https://python-all.ru/3.12/library/intro.html#availability): POSIX342343Добавлено в версии 3.9.344345Если *extra\_groups* не равен `None`, системный вызов setgroups() будет выполнен в дочернем процессе перед запуском подпроцесса. Строки, указанные в *extra\_groups*, будут найдены через [`grp.getgrnam()`](https://python-all.ru/3.12/library/grp.html#grp.getgrnam), и будут использованы значения из `gr_gid`. Целые числа будут переданы как есть (только POSIX).346347[Доступность](https://python-all.ru/3.12/library/intro.html#availability): POSIX348349Добавлено в версии 3.9.350351Если *user* не равен `None`, системный вызов setreuid() будет выполнен в дочернем процессе перед запуском подпроцесса. Если переданное значение – строка, она будет найдена через [`pwd.getpwnam()`](https://python-all.ru/3.12/library/pwd.html#pwd.getpwnam), и будет использовано значение из `pw_uid`. Если значение – целое число, оно будет передано как есть (только POSIX).352353[Доступность](https://python-all.ru/3.12/library/intro.html#availability): POSIX354355Добавлено в версии 3.9.356357Если *umask* не отрицателен, системный вызов umask() будет выполнен в дочернем процессе перед запуском подпроцесса.358359[Доступность](https://python-all.ru/3.12/library/intro.html#availability): POSIX360361Добавлено в версии 3.9.362363Если *env* не равен `None`, это должно быть отображение, определяющее переменные окружения для нового процесса; они используются вместо поведения по умолчанию, при котором наследуется окружение текущего процесса. Это отображение может быть типа str-\>str на любой платформе или bytes-\>bytes на платформах POSIX, как и [`os.environ`](https://python-all.ru/3.12/library/os.html#os.environ) или [`os.environb`](https://python-all.ru/3.12/library/os.html#os.environb).364365> **Примечание**366>367> Если указано, *env* должен предоставить все переменные, необходимые для выполнения программы. В Windows для запуска [сборки side-by-side](https://python-all.ru/3.12/library/subprocess.html) указанный *env* **должен** включать корректный `SystemRoot`.368369Если указаны *encoding* или *errors*, либо *text* равен true, файловые объекты *stdin*, *stdout* и *stderr* открываются в текстовом режиме с указанными *encoding* и *errors*, как описано выше в разделе [Часто используемые аргументы](https://python-all.ru/3.12/library/subprocess.html#frequently-used-arguments). Аргумент *universal\_newlines* эквивалентен *text* и предоставлен для обратной совместимости. По умолчанию файловые объекты открываются в бинарном режиме.370371Добавлено в версии 3.6: добавлены *encoding* и *errors*.372373Добавлено в версии 3.7: добавлен *text* как более читаемый псевдоним для *universal\_newlines*.374375Если указан, *startupinfo* будет объектом [`STARTUPINFO`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO), который передаётся в базовую функцию `CreateProcess`.376377Если указаны, *creationflags* могут быть одним или несколькими из следующих флагов:378379- [`CREATE_NEW_CONSOLE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE)380- [`CREATE_NEW_PROCESS_GROUP`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CREATE_NEW_PROCESS_GROUP)381- [`ABOVE_NORMAL_PRIORITY_CLASS`](https://python-all.ru/3.12/library/subprocess.html#subprocess.ABOVE_NORMAL_PRIORITY_CLASS)382- [`BELOW_NORMAL_PRIORITY_CLASS`](https://python-all.ru/3.12/library/subprocess.html#subprocess.BELOW_NORMAL_PRIORITY_CLASS)383- [`HIGH_PRIORITY_CLASS`](https://python-all.ru/3.12/library/subprocess.html#subprocess.HIGH_PRIORITY_CLASS)384- [`IDLE_PRIORITY_CLASS`](https://python-all.ru/3.12/library/subprocess.html#subprocess.IDLE_PRIORITY_CLASS)385- [`NORMAL_PRIORITY_CLASS`](https://python-all.ru/3.12/library/subprocess.html#subprocess.NORMAL_PRIORITY_CLASS)386- [`REALTIME_PRIORITY_CLASS`](https://python-all.ru/3.12/library/subprocess.html#subprocess.REALTIME_PRIORITY_CLASS)387- [`CREATE_NO_WINDOW`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CREATE_NO_WINDOW)388- [`DETACHED_PROCESS`](https://python-all.ru/3.12/library/subprocess.html#subprocess.DETACHED_PROCESS)389- [`CREATE_DEFAULT_ERROR_MODE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CREATE_DEFAULT_ERROR_MODE)390- [`CREATE_BREAKAWAY_FROM_JOB`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CREATE_BREAKAWAY_FROM_JOB)391392*pipesize* можно использовать для изменения размера канала, когда [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE) используется для *stdin*, *stdout* или *stderr*. Размер канала изменяется только на платформах, поддерживающих это (на момент написания – только Linux). Другие платформы игнорируют этот параметр.393394Изменено в версии 3.10: добавлен параметр *pipesize*.395396Объекты Popen поддерживаются как менеджеры контекста через оператор [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with): при выходе стандартные файловые дескрипторы закрываются, и процесс ожидается.397398```python399with Popen(["ifconfig"], stdout=PIPE) as proc:400    log.write(proc.stdout.read())401```402403Popen и другие функции этого модуля, использующие его, генерируют [аудирующее событие](https://python-all.ru/3.12/library/sys.html#auditing) `subprocess.Popen` с аргументами `executable`, `args`, `cwd` и `env`. Значение для `args` может быть одной строкой или списком строк в зависимости от платформы.404405Изменено в версии 3.2: добавлена поддержка менеджера контекста.406407Изменено в версии 3.6: деструктор Popen теперь выводит предупреждение [`ResourceWarning`](https://python-all.ru/3.12/library/exceptions.html#ResourceWarning), если дочерний процесс всё ещё выполняется.408409Изменено в версии 3.8: Popen может использовать [`os.posix_spawn()`](https://python-all.ru/3.12/library/os.html#os.posix_spawn) в некоторых случаях для повышения производительности. В подсистеме Windows для Linux и эмуляции пользователя QEMU конструктор Popen, использующий [`os.posix_spawn()`](https://python-all.ru/3.12/library/os.html#os.posix_spawn), больше не вызывает исключение при ошибках, таких как отсутствие программы, но дочерний процесс завершается с ненулевым [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.returncode).410411### Исключения412413Исключения, возникшие в дочернем процессе до начала выполнения новой программы, будут повторно вызваны в родительском процессе.414415Наиболее часто возникающее исключение – [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError). Это происходит, например, при попытке выполнить несуществующий файл. Приложения должны быть готовы к исключениям [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError). Обратите внимание: при `shell=True` [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError) будет вызван дочерним процессом, только если сама выбранная оболочка не была найдена. Чтобы определить, не удалось ли оболочке найти запрошенное приложение, необходимо проверить код возврата или вывод подпроцесса.416417[`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) будет вызван, если [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) вызвана с недопустимыми аргументами.418419[`check_call()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.check_call) и [`check_output()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.check_output) вызовут [`CalledProcessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError), если вызванный процесс вернёт ненулевой код возврата.420421Все функции и методы, которые принимают параметр *тайм-аут*, например [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) и [`Popen.communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate), будут возбуждать исключение [`TimeoutExpired`](https://python-all.ru/3.12/library/subprocess.html#subprocess.TimeoutExpired), если тайм-аут истекает до завершения процесса.422423Все исключения, определённые в этом модуле, наследуются от [`SubprocessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.SubprocessError).424425Добавлено в версии 3.3: Базовый класс [`SubprocessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.SubprocessError) был добавлен.426427## Вопросы безопасности428429В отличие от некоторых других функций popen, данная библиотека не будет неявно вызывать системную оболочку. Это означает, что все символы, включая метасимволы оболочки, могут безопасно передаваться дочерним процессам. Если оболочка вызывается явно, через `shell=True`, ответственность за то, чтобы все пробелы и метасимволы были правильно экранированы во избежание уязвимостей типа [внедрения команд оболочки](https://python-all.ru/3.12/library/subprocess.html) , лежит на приложении. На [некоторых платформах](https://python-all.ru/3.12/library/shlex.html#shlex-quote-warning) для этого экранирования можно использовать [`shlex.quote()`](https://python-all.ru/3.12/library/shlex.html#shlex.quote).430431В Windows пакетные файлы (`*.bat` или `*.cmd`) могут запускаться операционной системой в системной оболочке независимо от аргументов, переданных этой библиотеке. Это может привести к разбору аргументов по правилам оболочки, но без экранирования, добавляемого Python. Если вы намеренно запускаете пакетный файл с аргументами из ненадёжных источников, рассмотрите возможность передачи `shell=True`, чтобы позволить Python экранировать специальные символы. См. [gh-114539](https://python-all.ru/3.12/library/subprocess.html) для дополнительного обсуждения.432433## Объекты Popen434435Экземпляры класса [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) имеют следующие методы:436437#### `Popen.poll()`438439Проверяет, завершился ли дочерний процесс. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.returncode). В противном случае возвращает `None`.440441#### `Popen.wait(timeout=None)`442443Ожидает завершения дочернего процесса. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.returncode).444445Если процесс не завершается через *тайм-аут* секунд, возбуждается исключение [`TimeoutExpired`](https://python-all.ru/3.12/library/subprocess.html#subprocess.TimeoutExpired). Это исключение можно безопасно перехватить и повторить ожидание.446447> **Примечание**448>449> Это приведёт к взаимоблокировке при использовании `stdout=PIPE` или `stderr=PIPE` и когда дочерний процесс порождает достаточно выходных данных в канал, так что он блокируется в ожидании, когда буфер канала ОС примет больше данных. Используйте [`Popen.communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate) при работе с каналами, чтобы избежать этого.450451> **Примечание**452>453> Если параметр `timeout` не равен `None`, то (на POSIX) функция реализуется с помощью активного ожидания (неблокирующий вызов и короткие паузы). Используйте модуль [`asyncio`](https://python-all.ru/3.12/library/asyncio.html#module-asyncio) для асинхронного ожидания: см. [`asyncio.create_subprocess_exec`](https://python-all.ru/3.12/library/asyncio-subprocess.html#asyncio.create_subprocess_exec).454455Изменено в версии 3.3: добавлен *timeout*.456457#### `Popen.communicate(input=None, timeout=None)`458459Взаимодействие с процессом: отправляет данные в stdin. Читает данные из stdout и stderr до достижения конца файла. Ожидает завершения процесса и устанавливает атрибут [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.returncode). Необязательный аргумент *input* должен содержать данные для отправки дочернему процессу, или `None`, если данные не нужно отправлять дочернему процессу. Если потоки были открыты в текстовом режиме, *input* должен быть строкой. В противном случае – набором байтов.460461[`communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate) возвращает кортеж `(stdout_data, stderr_data)`. Данные будут строками, если потоки были открыты в текстовом режиме; в противном случае – байтами.462463Обратите внимание: если вы хотите отправить данные в stdin процесса, необходимо создать объект Popen с `stdin=PIPE`. Аналогично, чтобы получить что-то, кроме `None`, в результирующем кортеже, нужно также передать `stdout=PIPE` и/или `stderr=PIPE`.464465Если процесс не завершится за *timeout* секунд, будет вызвано исключение [`TimeoutExpired`](https://python-all.ru/3.12/library/subprocess.html#subprocess.TimeoutExpired). Перехват этого исключения и повторное обращение к обмену данными не приведет к потере вывода.466467Дочерний процесс не уничтожается по истечении тайм-аута, поэтому для корректной очистки хорошо написанное приложение должно уничтожить дочерний процесс и завершить обмен данными:468469```python470proc = subprocess.Popen(...)471try:472    outs, errs = proc.communicate(timeout=15)473except TimeoutExpired:474    proc.kill()475    outs, errs = proc.communicate()476```477478> **Примечание**479>480> Прочитанные данные буферизуются в памяти, поэтому не используйте этот метод, если размер данных велик или неограничен.481482Изменено в версии 3.3: добавлен *timeout*.483484#### `Popen.send_signal(signal)`485486Отправляет сигнал *signal* дочернему процессу.487488Ничего не делает, если процесс завершён.489490> **Примечание**491>492> В Windows SIGTERM является псевдонимом для [`terminate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.terminate). CTRL\_C\_EVENT и CTRL\_BREAK\_EVENT могут быть отправлены процессам, запущенным с параметром *creationflags*, который включает `CREATE_NEW_PROCESS_GROUP`.493494#### `Popen.terminate()`495496Останавливает дочерний процесс. В POSIX-системах метод отправляет [`SIGTERM`](https://python-all.ru/3.12/library/signal.html#signal.SIGTERM) дочернему процессу. В Windows вызывается функция Win32 API `TerminateProcess()` для остановки дочернего процесса.497498#### `Popen.kill()`499500Завершает дочерний процесс. В POSIX-системах функция отправляет SIGKILL дочернему процессу. В Windows [`kill()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.kill) является псевдонимом для [`terminate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.terminate).501502Следующие атрибуты также устанавливаются классом для доступа к ним. Их переназначение не поддерживается:503504#### `Popen.args`505506Аргумент *args* в том виде, в котором он был передан в [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) – последовательность аргументов программы или одна строка.507508Добавлено в версии 3.3.509510#### `Popen.stdin`511512Если аргумент *stdin* был [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), этот атрибут представляет собой доступный для записи объект потока данных, возвращаемый [`open()`](https://python-all.ru/3.12/library/functions.html#open). Если аргументы *encoding* или *errors* были указаны, или аргумент *text* или *universal\_newlines* был `True`, поток является текстовым, в противном случае – байтовым. Если аргумент *stdin* не был [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.513514#### `Popen.stdout`515516Если аргумент *stdout* был [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), этот атрибут представляет собой доступный для чтения объект потока данных, возвращаемый [`open()`](https://python-all.ru/3.12/library/functions.html#open). Чтение из потока даёт вывод дочернего процесса. Если аргументы *encoding* или *errors* были указаны, или аргумент *text* или *universal\_newlines* был `True`, поток является текстовым, в противном случае – байтовым. Если аргумент *stdout* не был [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.517518#### `Popen.stderr`519520Если аргумент *stderr* был [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), этот атрибут представляет собой доступный для чтения объект потока данных, возвращаемый [`open()`](https://python-all.ru/3.12/library/functions.html#open). Чтение из потока даёт вывод ошибок дочернего процесса. Если аргументы *encoding* или *errors* были указаны, или аргумент *text* или *universal\_newlines* был `True`, поток является текстовым, в противном случае – байтовым. Если аргумент *stderr* не был [`PIPE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.521522> **Предупреждение**523>524> Используйте [`communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate) вместо [`.stdin.write`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.stdin), [`.stdout.read`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.stdout) или [`.stderr.read`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.stderr), чтобы избежать взаимоблокировок из-за переполнения буферов каналов ОС и блокировки дочернего процесса.525526#### `Popen.pid`527528PID дочернего процесса.529530Обратите внимание: если аргумент *shell* установлен в `True`, это PID запущенной оболочки.531532#### `Popen.returncode`533534Код возврата дочернего процесса. Изначально `None`, [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.returncode) устанавливается вызовом методов [`poll()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.poll), [`wait()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.wait) или [`communicate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.communicate), если они обнаруживают, что процесс завершён.535536Значение `None` указывает, что процесс ещё не завершился на момент последнего вызова метода.537538Отрицательное значение `-N` указывает, что дочерний процесс был завершён сигналом `N` (только POSIX).539540## Вспомогательные классы Windows Popen541542Класс [`STARTUPINFO`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO) и следующие константы доступны только в Windows.543544#### `class subprocess.STARTUPINFO(*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None)`545546Частичная поддержка структуры Windows [STARTUPINFO](https://python-all.ru/3.12/library/subprocess.html) используется для создания [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen). Следующие атрибуты можно установить, передав их как аргументы только по ключу.547548Изменено в версии 3.7: Добавлена поддержка аргументов только по ключу.549550#### `dwFlags`551552Битовое поле, определяющее, используются ли определённые атрибуты [`STARTUPINFO`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO) при создании окна процессом.553554```python555si = subprocess.STARTUPINFO()556si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW557```558559#### `hStdInput`560561Если [`dwFlags`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного ввода процесса. Если [`STARTF_USESTDHANDLES`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTF_USESTDHANDLES) не указан, по умолчанию для стандартного ввода используется буфер клавиатуры.562563#### `hStdOutput`564565Если [`dwFlags`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного вывода процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартного вывода используется буфер окна консоли.566567#### `hStdError`568569Если [`dwFlags`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного вывода ошибок процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартного вывода ошибок используется буфер окна консоли.570571#### `wShowWindow`572573Если в [`dwFlags`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указан [`STARTF_USESHOWWINDOW`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTF_USESHOWWINDOW), этот атрибут может принимать любое значение, которое можно указать в параметре `nCmdShow` для функции [ShowWindow](https://python-all.ru/3.12/library/subprocess.html), за исключением `SW_SHOWDEFAULT`. В противном случае этот атрибут игнорируется.574575Для этого атрибута предоставляется [`SW_HIDE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.SW_HIDE). Он используется, когда [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) вызывается с `shell=True`.576577#### `lpAttributeList`578579Словарь дополнительных атрибутов для создания процесса, как указано в `STARTUPINFOEX`; см. [UpdateProcThreadAttribute](https://python-all.ru/3.12/library/subprocess.html).580581Поддерживаемые атрибуты:582583****handle\_list****584585Последовательность дескрипторов, которые будут унаследованы. *close\_fds* должно быть истинным, если последовательность непуста.586587Дескрипторы должны быть временно сделаны наследуемыми с помощью [`os.set_handle_inheritable()`](https://python-all.ru/3.12/library/os.html#os.set_handle_inheritable) при передаче в конструктор [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen), иначе будет возбуждено [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError) с кодом ошибки Windows `ERROR_INVALID_PARAMETER` (87).588589> **Предупреждение**590>591> В многопоточном процессе следует соблюдать осторожность, чтобы избежать утечки дескрипторов, помеченных как наследуемые, при совместном использовании этой возможности с параллельными вызовами других функций создания процессов, которые наследуют все дескрипторы, например [`os.system()`](https://python-all.ru/3.12/library/os.html#os.system). Это также относится к перенаправлению стандартных дескрипторов, которое временно создаёт наследуемые дескрипторы.592593Добавлено в версии 3.7.594595### Константы Windows596597Модуль [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess) предоставляет следующие константы.598599#### `subprocess.STD_INPUT_HANDLE`600601Устройство стандартного ввода. Изначально это буфер консольного ввода, `CONIN$`.602603#### `subprocess.STD_OUTPUT_HANDLE`604605Устройство стандартного вывода. Изначально это активный буфер консольного экрана, `CONOUT$`.606607#### `subprocess.STD_ERROR_HANDLE`608609Устройство стандартного вывода ошибок. Изначально это активный буфер консольного экрана, `CONOUT$`.610611#### `subprocess.SW_HIDE`612613Скрывает окно. Другое окно будет активировано.614615#### `subprocess.STARTF_USESTDHANDLES`616617Указывает, что атрибуты [`STARTUPINFO.hStdInput`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.hStdInput), [`STARTUPINFO.hStdOutput`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.hStdOutput) и [`STARTUPINFO.hStdError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.hStdError) содержат дополнительную информацию.618619#### `subprocess.STARTF_USESHOWWINDOW`620621Указывает, что атрибут [`STARTUPINFO.wShowWindow`](https://python-all.ru/3.12/library/subprocess.html#subprocess.STARTUPINFO.wShowWindow) содержит дополнительную информацию.622623#### `subprocess.CREATE_NEW_CONSOLE`624625Новый процесс получает новую консоль вместо наследования консоли родителя (по умолчанию).626627#### `subprocess.CREATE_NEW_PROCESS_GROUP`628629Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что будет создана новая группа процессов. Этот флаг необходим для использования [`os.kill()`](https://python-all.ru/3.12/library/os.html#os.kill) в подпроцессе.630631Этот флаг игнорируется, если указан [`CREATE_NEW_CONSOLE`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE).632633#### `subprocess.ABOVE_NORMAL_PRIORITY_CLASS`634635Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс будет иметь приоритет выше среднего.636637Добавлено в версии 3.7.638639#### `subprocess.BELOW_NORMAL_PRIORITY_CLASS`640641Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс будет иметь приоритет ниже среднего.642643Добавлено в версии 3.7.644645#### `subprocess.HIGH_PRIORITY_CLASS`646647Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс будет иметь высокий приоритет.648649Добавлено в версии 3.7.650651#### `subprocess.IDLE_PRIORITY_CLASS`652653Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс будет иметь приоритет простоя (самый низкий).654655Добавлено в версии 3.7.656657#### `subprocess.NORMAL_PRIORITY_CLASS`658659Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс будет иметь обычный приоритет (по умолчанию).660661Добавлено в версии 3.7.662663#### `subprocess.REALTIME_PRIORITY_CLASS`664665Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс будет иметь приоритет реального времени. Почти никогда не следует использовать REALTIME\_PRIORITY\_CLASS, поскольку он прерывает работу системных потоков, управляющих вводом с мыши, вводом с клавиатуры и фоновой записью данных на диск. Этот класс может подходить для приложений, которые напрямую «общаются» с оборудованием или выполняют короткие задачи, требующие ограниченного числа прерываний.666667Добавлено в версии 3.7.668669#### `subprocess.CREATE_NO_WINDOW`670671Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс не будет создавать окно.672673Добавлено в версии 3.7.674675#### `subprocess.DETACHED_PROCESS`676677Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс не будет наследовать консоль родительского процесса. Это значение нельзя использовать вместе с CREATE\_NEW\_CONSOLE.678679Добавлено в версии 3.7.680681#### `subprocess.CREATE_DEFAULT_ERROR_MODE`682683Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс не наследует режим ошибок вызывающего процесса. Вместо этого новый процесс получает режим ошибок по умолчанию. Эта особенность особенно полезна для многопоточных приложений оболочки, которые работают с отключенными фатальными ошибками.684685Добавлено в версии 3.7.686687#### `subprocess.CREATE_BREAKAWAY_FROM_JOB`688689Параметр [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что новый процесс не связан с заданием.690691Добавлено в версии 3.7.692693## Старый высокоуровневый API694695До Python 3.5 эти три функции представляли собой высокоуровневый API для subprocess. Теперь во многих случаях можно использовать [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run), но значительная часть существующего кода по-прежнему вызывает эти функции.696697#### `subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)`698699Запускает команду, описанную параметром *args*. Ожидает завершения команды и затем возвращает атрибут [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.returncode).700701Коду, которому нужно захватывать stdout или stderr, следует использовать [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) вместо:702703```python704run(...).returncode705```706707Чтобы подавить stdout или stderr, укажите значение [`DEVNULL`](https://python-all.ru/3.12/library/subprocess.html#subprocess.DEVNULL).708709Аргументы, показанные выше, – лишь некоторые из часто используемых. Полная сигнатура функции совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) – эта функция передаёт все переданные аргументы, кроме *timeout*, напрямую в этот интерфейс.710711> **Примечание**712>713> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией. Дочерний процесс будет заблокирован, если он выдаст в канал достаточно данных, чтобы заполнить буфер канала ОС, поскольку каналы не читаются.714715Изменено в версии 3.3: добавлен *timeout*.716717Изменено в версии 3.12: Изменён порядок поиска в командной оболочке Windows для `shell=True`. Текущий каталог и `%PATH%` заменены на `%COMSPEC%` и `%SystemRoot%\System32\cmd.exe`. В результате подбросить вредоносную программу с именем `cmd.exe` в текущий каталог больше не работает.718719#### `subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)`720721Запускает команду с аргументами. Ожидает завершения команды. Если код возврата равен нулю, возвращает управление, в противном случае возбуждает [`CalledProcessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError). Объект [`CalledProcessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError) содержит код возврата в атрибуте [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError.returncode). Если [`check_call()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.check_call) не удалось запустить процесс, он распространяет исключение, которое было возбуждено.722723Коду, которому нужно захватывать stdout или stderr, следует использовать [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) вместо:724725```python726run(..., check=True)727```728729Чтобы подавить stdout или stderr, укажите значение [`DEVNULL`](https://python-all.ru/3.12/library/subprocess.html#subprocess.DEVNULL).730731Аргументы, показанные выше, – лишь некоторые из часто используемых. Полная сигнатура функции совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) – эта функция передаёт все переданные аргументы, кроме *timeout*, напрямую в этот интерфейс.732733> **Примечание**734>735> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией. Дочерний процесс будет заблокирован, если он выдаст в канал достаточно данных, чтобы заполнить буфер канала ОС, поскольку каналы не читаются.736737Изменено в версии 3.3: добавлен *timeout*.738739Изменено в версии 3.12: Изменён порядок поиска в командной оболочке Windows для `shell=True`. Текущий каталог и `%PATH%` заменены на `%COMSPEC%` и `%SystemRoot%\System32\cmd.exe`. В результате подбросить вредоносную программу с именем `cmd.exe` в текущий каталог больше не работает.740741#### `subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None, **other_popen_kwargs)`742743Выполняет команду с аргументами и возвращает её вывод.744745Если код возврата был ненулевым, возбуждается исключение [`CalledProcessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError). Объект [`CalledProcessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError) будет содержать код возврата в атрибуте [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError.returncode), а вывод – в атрибуте [`output`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError.output).746747Это эквивалентно:748749```python750run(..., check=True, stdout=PIPE).stdout751```752753Аргументы, показанные выше, – лишь некоторые из часто используемых. Полная сигнатура функции в значительной степени совпадает с сигнатурой [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run) – большинство аргументов передаются напрямую в этот интерфейс. Однако есть одно отклонение в API от поведения [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run): передача `input=None` будет вести себя так же, как `input=b''` (или `input=''`, в зависимости от других аргументов), а не использовать файловый дескриптор стандартного ввода родительского процесса.754755По умолчанию эта функция возвращает данные в виде закодированных байтов. Фактическая кодировка выходных данных может зависеть от вызываемой команды, поэтому декодирование в текст часто приходится выполнять на уровне приложения.756757Это поведение можно переопределить, установив *text*, *encoding*, *errors* или *universal\_newlines* в `True`, как описано в [Часто используемые аргументы](https://python-all.ru/3.12/library/subprocess.html#frequently-used-arguments) и [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run).758759Чтобы также захватывать стандартный поток ошибок в результате, используйте `stderr=subprocess.STDOUT`:760761```python762>>> subprocess.check_output(763...     "ls non_existent_file; exit 0",764...     stderr=subprocess.STDOUT,765...     shell=True)766'ls: non_existent_file: No such file or directory\n'767```768769Добавлено в версии 3.1.770771Изменено в версии 3.3: добавлен *timeout*.772773Изменено в версии 3.4: добавлена поддержка именованного аргумента *input*.774775Изменено в версии 3.6: добавлены *encoding* и *errors*. Подробнее см. [`run()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.run).776777Добавлено в версии 3.7: добавлен *text* как более читаемый псевдоним для *universal\_newlines*.778779Изменено в версии 3.12: Изменён порядок поиска в командной оболочке Windows для `shell=True`. Текущий каталог и `%PATH%` заменены на `%COMSPEC%` и `%SystemRoot%\System32\cmd.exe`. В результате подбросить вредоносную программу с именем `cmd.exe` в текущий каталог больше не работает.780781## Замена старых функций модулем [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess)782783В этом разделе «a становится b» означает, что b можно использовать как замену для a.784785> **Примечание**786>787> Все функции вида «a» в этом разделе завершаются ошибкой (более или менее) молча, если выполняемая программа не найдена; замены «b» вместо этого возбуждают [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError).788>789> Кроме того, замены, использующие [`check_output()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.check_output), будут завершаться ошибкой с [`CalledProcessError`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError), если запрошенная операция возвращает ненулевой код возврата. Вывод по-прежнему доступен как атрибут [`output`](https://python-all.ru/3.12/library/subprocess.html#subprocess.CalledProcessError.output) возбуждённого исключения.790791В следующих примерах предполагается, что соответствующие функции уже импортированы из модуля [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess).792793### Замена подстановки команд оболочки **/bin/sh**794795```bash796output=$(mycmd myarg)797```798799становится:800801```python802output = check_output(["mycmd", "myarg"])803```804805### Замена конвейера оболочки806807```bash808output=$(dmesg | grep hda)809```810811становится:812813```python814p1 = Popen(["dmesg"], stdout=PIPE)815p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)816p1.stdout.close()  # Разрешить p1 получать SIGPIPE, если p2 завершается.817output = p2.communicate()[0]818```819820Вызов `p1.stdout.close()` после запуска p2 важен, чтобы p1 получил SIGPIPE, если p2 завершится раньше p1.821822В качестве альтернативы, для доверенного ввода можно по-прежнему напрямую использовать встроенную поддержку конвейеров оболочки:823824```bash825output=$(dmesg | grep hda)826```827828становится:829830```python831output = check_output("dmesg | grep hda", shell=True)832```833834### Замена [`os.system()`](https://python-all.ru/3.12/library/os.html#os.system)835836```python837sts = os.system("mycmd" + " myarg")838# становится839retcode = call("mycmd" + " myarg", shell=True)840```841842Примечания:843844- Вызов программы через оболочку обычно не требуется.845- Возвращаемое значение [`call()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.call) кодируется иначе, чем в случае [`os.system()`](https://python-all.ru/3.12/library/os.html#os.system).846- Функция [`os.system()`](https://python-all.ru/3.12/library/os.html#os.system) игнорирует сигналы SIGINT и SIGQUIT, пока выполняется команда, но вызывающий код должен делать это отдельно при использовании модуля [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess).847848Более реалистичный пример выглядит так:849850```python851try:852    retcode = call("mycmd" + " myarg", shell=True)853    if retcode < 0:854        print("Child was terminated by signal", -retcode, file=sys.stderr)855    else:856        print("Child returned", retcode, file=sys.stderr)857except OSError as e:858    print("Execution failed:", e, file=sys.stderr)859```860861### Замена семейства [`os.spawn`](https://python-all.ru/3.12/library/os.html#os.spawnl)862863Пример P\_NOWAIT:864865```python866pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")867==>868pid = Popen(["/bin/mycmd", "myarg"]).pid869```870871Пример P\_WAIT:872873```python874retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")875==>876retcode = call(["/bin/mycmd", "myarg"])877```878879Пример с вектором:880881```python882os.spawnvp(os.P_NOWAIT, path, args)883==>884Popen([path] + args[1:])885```886887Пример с окружением:888889```python890os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)891==>892Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})893```894895### Замена [`os.popen()`](https://python-all.ru/3.12/library/os.html#os.popen), `os.popen2()`, `os.popen3()`896897```python898(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)899==>900p = Popen(cmd, shell=True, bufsize=bufsize,901          stdin=PIPE, stdout=PIPE, close_fds=True)902(child_stdin, child_stdout) = (p.stdin, p.stdout)903```904905```python906(child_stdin,907 child_stdout,908 child_stderr) = os.popen3(cmd, mode, bufsize)909==>910p = Popen(cmd, shell=True, bufsize=bufsize,911          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)912(child_stdin,913 child_stdout,914 child_stderr) = (p.stdin, p.stdout, p.stderr)915```916917```python918(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)919==>920p = Popen(cmd, shell=True, bufsize=bufsize,921          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)922(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)923```924925Обработка кода возврата выполняется следующим образом:926927```python928pipe = os.popen(cmd, 'w')929...930rc = pipe.close()931if rc is not None and rc >> 8:932    print("There were some errors")933==>934process = Popen(cmd, stdin=PIPE)935...936process.stdin.close()937if process.wait() != 0:938    print("There were some errors")939```940941### Замена функций из модуля `popen2`942943> **Примечание**944>945> Если аргумент cmd функций popen2 является строкой, команда выполняется через /bin/sh. Если это список, команда выполняется напрямую.946947```python948(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)949==>950p = Popen("somestring", shell=True, bufsize=bufsize,951          stdin=PIPE, stdout=PIPE, close_fds=True)952(child_stdout, child_stdin) = (p.stdout, p.stdin)953```954955```python956(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)957==>958p = Popen(["mycmd", "myarg"], bufsize=bufsize,959          stdin=PIPE, stdout=PIPE, close_fds=True)960(child_stdout, child_stdin) = (p.stdout, p.stdin)961```962963`popen2.Popen3` и `popen2.Popen4` в основном работают как [`subprocess.Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen), за исключением того, что:964965- [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen) вызывает исключение, если выполнение завершается неудачей.966- Аргумент *capturestderr* заменяется аргументом *stderr*.967- `stdin=PIPE` и `stdout=PIPE` должны быть указаны.968- popen2 по умолчанию закрывает все файловые дескрипторы, но необходимо указать `close_fds=True` с [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen), чтобы гарантировать такое поведение на всех платформах или в старых версиях Python.969970## Устаревшие функции вызова оболочки971972Этот модуль также предоставляет следующие устаревшие функции из модуля `commands` версии 2.x. Эти операции неявно вызывают системную оболочку, и ни одно из описанных выше гарантий безопасности и согласованности обработки исключений не действует для этих функций.973974#### `subprocess.getstatusoutput(cmd, *, encoding=None, errors=None)`975976Возвращает `(exitcode, output)` выполнения *cmd* в оболочке.977978Выполняет строку *cmd* в оболочке с `Popen.check_output()` и возвращает кортеж из двух элементов `(exitcode, output)`. *encoding* и *errors* используются для декодирования вывода; см. примечания к [Часто используемые аргументы](https://python-all.ru/3.12/library/subprocess.html#frequently-used-arguments) для подробностей.979980Завершающий символ новой строки удаляется из вывода. Код завершения команды можно интерпретировать как код возврата подпроцесса. Пример:981982```python983>>> subprocess.getstatusoutput('ls /bin/ls')984(0, '/bin/ls')985>>> subprocess.getstatusoutput('cat /bin/junk')986(1, 'cat: /bin/junk: No such file or directory')987>>> subprocess.getstatusoutput('/bin/junk')988(127, 'sh: /bin/junk: not found')989>>> subprocess.getstatusoutput('/bin/kill $$')990(-15, '')991```992993[Доступность](https://python-all.ru/3.12/library/intro.html#availability): Unix, Windows.994995Изменено в версии 3.3.4: Добавлена поддержка Windows.996997Теперь функция возвращает (exitcode, output) вместо (status, output), как это было в Python 3.3.3 и более ранних версиях. exitcode имеет то же значение, что и [`returncode`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.returncode).998999Изменено в версии 3.11: Добавлены параметры *encoding* и *errors*.10001001#### `subprocess.getoutput(cmd, *, encoding=None, errors=None)`10021003Возвращает вывод (stdout и stderr) выполнения *cmd* в оболочке.10041005Как [`getstatusoutput()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.getstatusoutput), за исключением того, что код завершения игнорируется, а возвращаемое значение – строка, содержащая вывод команды. Пример:10061007```python1008>>> subprocess.getoutput('ls /bin/ls')1009'/bin/ls'1010```10111012[Доступность](https://python-all.ru/3.12/library/intro.html#availability): Unix, Windows.10131014Изменено в версии 3.3.4: Добавлена поддержка Windows10151016Изменено в версии 3.11: Добавлены параметры *encoding* и *errors*.10171018## Примечания10191020### Преобразование последовательности аргументов в строку в Windows10211022В Windows последовательность *args* преобразуется в строку, которая может быть разобрана с помощью следующих правил (которые соответствуют правилам, используемым в MS C runtime):102310241. Аргументы разделяются пробельными символами, то есть пробелом или табуляцией.10252. Строка, заключённая в двойные кавычки, интерпретируется как один аргумент, независимо от пробельных символов внутри неё. Строка в кавычках может быть встроена в аргумент.10263. Двойная кавычка, перед которой стоит обратная косая черта, интерпретируется как литеральная двойная кавычка.10274. Обратные косые черты интерпретируются буквально, если только они не стоят непосредственно перед двойной кавычкой.10285. Если обратные косые черты стоят непосредственно перед двойной кавычкой, каждая пара обратных косых черт интерпретируется как литеральная обратная косая черта. Если количество обратных косых черт нечётное, последняя обратная косая черта экранирует следующую за ней двойную кавычку, как описано в правиле 3.10291030> **См. также**1031>1032> **[`shlex`](https://python-all.ru/3.12/library/shlex.html#module-shlex)**1033>1034> Модуль, предоставляющий функцию для разбора и экранирования командных строк.10351036### Отключение использования `vfork()` или `posix_spawn()`10371038В Linux [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess) по умолчанию использует системный вызов `vfork()` внутренне, когда это безопасно, вместо `fork()`. Это значительно повышает производительность.10391040Если возникнет исключительно необычная ситуация, когда потребуется запретить Python использовать `vfork()`, можно установить атрибут `subprocess._USE_VFORK` в значение false.10411042```python1043subprocess._USE_VFORK = False  # См. проблему CPython gh-NNNNNN.1044```10451046Установка этого не влияет на использование `posix_spawn()`, который может использовать `vfork()` внутри своей реализации libc. Существует аналогичный атрибут `subprocess._USE_POSIX_SPAWN`, если нужно запретить использование и его.10471048```python1049subprocess._USE_POSIX_SPAWN = False  # См. проблему CPython gh-NNNNNN.1050```10511052Устанавливать эти атрибуты в false безопасно в любой версии Python. Они не будут оказывать эффекта на старых версиях, где не поддерживаются. Не стоит предполагать, что атрибуты доступны для чтения. Несмотря на их названия, значение true не означает, что соответствующая функция будет использоваться, а лишь то, что она может быть использована.10531054Пожалуйста, сообщайте об ошибках каждый раз, когда вам приходится использовать эти внутренние настройки, и прикладывайте способ воспроизведения проблемы. Ссылайтесь на этот отчёт об ошибке в комментарии в своём коде.10551056Добавлено в версии 3.8: `_USE_POSIX_SPAWN`10571058Добавлено в версии 3.11: `_USE_VFORK`1059