subprocess.md
1> **Источник:** https://python-all.ru/3.6/library/subprocess.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 17.5. [`subprocess`](https://python-all.ru/3.6/library/subprocess.html#module-subprocess) – Управление подпроцессами89**Исходный код:** [Lib/subprocess.py](https://python-all.ru/src/3.6/Lib/subprocess.py)1011---1213Модуль [`subprocess`](https://python-all.ru/3.6/library/subprocess.html#module-subprocess) позволяет создавать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать их коды возврата. Этот модуль призван заменить несколько более старых модулей и функций:1415```python16os.system17os.spawn*18```1920Информация о том, как с помощью модуля [`subprocess`](https://python-all.ru/3.6/library/subprocess.html#module-subprocess) заменить эти модули и функции, приведена в следующих разделах.2122> **См. также**23>24> [**PEP 324**](https://python-all.ru/3.6/library/subprocess.html) – PEP, предлагающий модуль подпроцесса2526## 17.5.1. Использование модуля [`subprocess`](https://python-all.ru/3.6/library/subprocess.html#module-subprocess)2728Рекомендуемый способ вызова подпроцессов – использовать функцию [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run) для всех случаев, с которыми она может справиться. Для более сложных случаев можно напрямую использовать нижележащий интерфейс [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen).2930Функция [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run) была добавлена в Python 3.5; если требуется сохранить совместимость со старыми версиями, см. раздел [Старого высокоуровневого API](https://python-all.ru/3.6/library/subprocess.html#call-function-trio).3132#### `subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, env=None)`3334Выполняет команду, описанную аргументом *args*. Ожидает завершения команды и возвращает экземпляр [`CompletedProcess`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CompletedProcess).3536Аргументы, показанные выше, – лишь наиболее распространённые; они описаны ниже в разделе [Часто используемые аргументы](https://python-all.ru/3.6/library/subprocess.html#frequently-used-arguments) (отсюда использование только именованных аргументов в сокращённой сигнатуре). Полная сигнатура функции в основном совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) – за исключением *timeout*, *input* и *check*; все остальные аргументы этой функции передаются этому интерфейсу.3738По умолчанию stdout и stderr не захватываются. Чтобы это сделать, передайте [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE) для аргументов *stdout* и/или *stderr*.3940Аргумент *timeout* передаётся в [`Popen.communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate). Если время ожидания истекает, дочерний процесс будет завершён, и он будет ожидаться. Исключение [`TimeoutExpired`](https://python-all.ru/3.6/library/subprocess.html#subprocess.TimeoutExpired) будет возбуждено повторно после завершения дочернего процесса.4142Аргумент *input* передаётся в [`Popen.communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate) и, таким образом, в stdin подпроцесса. Если используется, он должен быть последовательностью байтов или строкой, если указаны *encoding* или *errors*, или *universal\_newlines* равно True. При использовании внутренний объект [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) автоматически создаётся с `stdin=PIPE`, и аргумент *stdin* также не может быть использован.4344Если *check* истинно и процесс завершается с ненулевым кодом возврата, будет возбуждено исключение [`CalledProcessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError). Атрибуты этого исключения содержат аргументы, код возврата, а также stdout и stderr, если они были захвачены.4546Если указаны *encoding* или *errors*, или *universal\_newlines* равен True, файловые объекты для stdin, stdout и stderr открываются в текстовом режиме с использованием указанных *encoding* и *errors* или значений по умолчанию [`io.TextIOWrapper`](https://python-all.ru/3.6/library/io.html#io.TextIOWrapper). В противном случае файловые объекты открываются в двоичном режиме.4748Если *env* не равен `None`, он должен быть отображением (mapping), определяющим переменные окружения для нового процесса; они используются вместо поведения по умолчанию, заключающегося в наследовании окружения текущего процесса. Он передается напрямую в [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen).4950Примеры:5152```python53>>> subprocess.run(["ls", "-l"]) # не захватывает вывод54CompletedProcess(args=['ls', '-l'], returncode=0)5556>>> subprocess.run("exit 1", shell=True, check=True)57Traceback (most recent call last):58 ...59subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 16061>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)62CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,63stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')64```6566Новое в версии 3.5.6768Изменено в версии 3.6: Добавлены параметры *encoding* и *errors*6970#### `class subprocess.CompletedProcess`7172Возвращаемое значение [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run), представляющее завершившийся процесс.7374#### `args`7576Аргументы, использованные для запуска процесса. Это может быть список или строка.7778#### `returncode`7980Статус выхода дочернего процесса. Обычно статус выхода 0 указывает на успешное завершение.8182Отрицательное значение `-N` указывает, что дочерний процесс был завершён сигналом `N` (только POSIX).8384#### `stdout`8586Захваченный stdout дочернего процесса. Последовательность байтов или строка, если [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run) был вызван с указанием encoding или errors. `None`, если stdout не был захвачен.8788Если процесс был запущен с `stderr=subprocess.STDOUT`, stdout и stderr будут объединены в этом атрибуте, а [`stderr`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CompletedProcess.stderr) будет равно `None`.8990#### `stderr`9192Захваченный stderr дочернего процесса. Последовательность байтов или строка, если [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run) был вызван с указанием encoding или errors. `None`, если stderr не был захвачен.9394#### `check_returncode()`9596Если [`returncode`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CompletedProcess.returncode) ненулевой, возбуждается [`CalledProcessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError).9798Новое в версии 3.5.99100#### `subprocess.DEVNULL`101102Специальное значение, которое можно использовать в качестве аргумента *stdin*, *stdout* или *stderr* для [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) и указывает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.6/library/os.html#os.devnull).103104Новое в версии 3.3.105106#### `subprocess.PIPE`107108Специальное значение, которое можно использовать в качестве аргумента *stdin*, *stdout* или *stderr* для [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) и указывает, что должен быть открыт канал (pipe) для стандартного потока. Наиболее полезен с [`Popen.communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate).109110#### `subprocess.STDOUT`111112Специальное значение, которое можно использовать в качестве аргумента *stderr* для [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) и указывает, что стандартный поток ошибок должен направляться в тот же дескриптор, что и стандартный вывод.113114#### `exception subprocess.SubprocessError`115116Базовый класс для всех остальных исключений из этого модуля.117118Новое в версии 3.3.119120#### `exception subprocess.TimeoutExpired`121122Подкласс [`SubprocessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.SubprocessError), возбуждается при истечении тайм-аута во время ожидания дочернего процесса.123124#### `cmd`125126Команда, которая использовалась для запуска дочернего процесса.127128#### `timeout`129130Тайм-аут в секундах.131132#### `output`133134Вывод дочернего процесса, если он был захвачен с помощью [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run) или [`check_output()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.check_output). В противном случае `None`.135136#### `stdout`137138Псевдоним для output, для симметрии с [`stderr`](https://python-all.ru/3.6/library/subprocess.html#subprocess.TimeoutExpired.stderr).139140#### `stderr`141142Вывод stderr дочернего процесса, если он был захвачен с помощью [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run). В противном случае – `None`.143144Новое в версии 3.3.145146Изменено в версии 3.5: добавлены атрибуты *stdout* и *stderr*147148#### `exception subprocess.CalledProcessError`149150Подкласс [`SubprocessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.SubprocessError), вызываемый, когда процесс, запущенный через [`check_call()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.check_call) или [`check_output()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.check_output), возвращает ненулевой код завершения.151152#### `returncode`153154Статус выхода дочернего процесса. Если процесс завершился из-за сигнала, это будет отрицательный номер сигнала.155156#### `cmd`157158Команда, которая использовалась для запуска дочернего процесса.159160#### `output`161162Вывод дочернего процесса, если он был захвачен с помощью [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run) или [`check_output()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.check_output). В противном случае `None`.163164#### `stdout`165166Псевдоним для output, для симметрии с [`stderr`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError.stderr).167168#### `stderr`169170Вывод stderr дочернего процесса, если он был захвачен с помощью [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run). В противном случае – `None`.171172Изменено в версии 3.5: добавлены атрибуты *stdout* и *stderr*173174### 17.5.1.1. Часто используемые аргументы175176Чтобы поддерживать широкий спектр сценариев использования, конструктор [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) (и удобные функции) принимает большое количество необязательных аргументов. Для большинства типичных случаев многие из этих аргументов можно безопасно оставить со значениями по умолчанию. Наиболее часто требуемые аргументы:177178> *args* обязателен для всех вызовов и должен быть строкой или последовательностью аргументов программы. Как правило, предпочтительнее передавать последовательность аргументов, так как это позволяет модулю позаботиться о любом необходимом экранировании и кавычках аргументов (например, для пробелов в именах файлов). Если передаётся одна строка, то либо *shell* должен быть [`True`](https://python-all.ru/3.6/library/constants.html#True) (см. ниже), либо строка должна просто указывать имя программы для запуска без указания каких-либо аргументов.179>180> *stdin*, *stdout* и *stderr* задают файловые дескрипторы стандартного ввода, стандартного вывода и стандартного вывода ошибок выполняемой программы соответственно. Допустимые значения: [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE), [`DEVNULL`](https://python-all.ru/3.6/library/subprocess.html#subprocess.DEVNULL), существующий файловый дескриптор (положительное целое число), существующий файловый объект и `None`. [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE) указывает, что должен быть создан новый канал к дочернему процессу. [`DEVNULL`](https://python-all.ru/3.6/library/subprocess.html#subprocess.DEVNULL) указывает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.6/library/os.html#os.devnull). При настройках по умолчанию (`None`) перенаправление не выполняется; файловые дескрипторы дочернего процесса наследуются от родительского. Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr дочернего процесса должны быть направлены в тот же файловый дескриптор, что и для *stdout*.181>182> Если указаны *encoding* или *errors*, или *universal\_newlines* равен True, файловые объекты *stdin*, *stdout* и *stderr* будут открыты в текстовом режиме с использованием *encoding* и *errors*, указанных в вызове, или значений по умолчанию для [`io.TextIOWrapper`](https://python-all.ru/3.6/library/io.html#io.TextIOWrapper).183>184> Для *stdin* символы конца строки `'\n'` во входных данных будут преобразованы в стандартный разделитель строк [`os.linesep`](https://python-all.ru/3.6/library/os.html#os.linesep). Для *stdout* и *stderr* все концы строк в выводе будут преобразованы в `'\n'`. Подробнее см. документацию класса [`io.TextIOWrapper`](https://python-all.ru/3.6/library/io.html#io.TextIOWrapper), когда аргумент *newline* его конструктора равен `None`.185>186> Если текстовый режим не используется, *stdin*, *stdout* и *stderr* будут открыты как двоичные потоки. Никакого преобразования кодировки или концов строк не выполняется.187>188> Новое в версии 3.6: Добавлены параметры *encoding* и *errors*.189>190> > **Примечание**191> >192> > Атрибут newlines файловых объектов [`Popen.stdin`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.stdin), [`Popen.stdout`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.stdout) и [`Popen.stderr`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.stderr) не обновляется методом [`Popen.communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate).193>194> Если *shell* равен `True`, указанная команда будет выполняться через оболочку. Это может быть полезно, если вы используете Python в основном из-за улучшенного управления потоком, которое он предлагает по сравнению с большинством системных оболочек, и при этом хотите удобного доступа к другим возможностям оболочки, таким как конвейеры, подстановка имен файлов, подстановка переменных окружения и раскрытие `~` в домашний каталог пользователя. Однако имейте в виду, что сам Python предлагает реализации многих функций, подобных оболочке (в частности, [`glob`](https://python-all.ru/3.6/library/glob.html#module-glob), [`fnmatch`](https://python-all.ru/3.6/library/fnmatch.html#module-fnmatch), [`os.walk()`](https://python-all.ru/3.6/library/os.html#os.walk), [`os.path.expandvars()`](https://python-all.ru/3.6/library/os.path.html#os.path.expandvars), [`os.path.expanduser()`](https://python-all.ru/3.6/library/os.path.html#os.path.expanduser) и [`shutil`](https://python-all.ru/3.6/library/shutil.html#module-shutil)).195>196> Изменено в версии 3.3: Когда *universal\_newlines* имеет значение `True`, класс использует кодировку [`locale.getpreferredencoding(False)`](https://python-all.ru/3.6/library/locale.html#locale.getpreferredencoding) вместо `locale.getpreferredencoding()`. Подробнее об этом изменении см. в документации класса [`io.TextIOWrapper`](https://python-all.ru/3.6/library/io.html#io.TextIOWrapper).197>198> > **Примечание**199> >200> > Перед использованием `shell=True` прочтите раздел [Рекомендации по безопасности](https://python-all.ru/3.6/library/subprocess.html#security-considerations).201202Эти опции, как и все остальные, подробно описаны в документации конструктора [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen).203204### 17.5.1.2. Конструктор Popen205206Создание и управление базовыми процессами в этом модуле осуществляется классом [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen). Он предоставляет большую гибкость, чтобы разработчики могли обрабатывать менее распространённые случаи, не охваченные удобными функциями.207208#### `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=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None)`209210Запускает дочернюю программу в новом процессе. На POSIX класс использует поведение, подобное [`os.execvp()`](https://python-all.ru/3.6/library/os.html#os.execvp), для выполнения дочерней программы. На Windows класс использует функцию Windows `CreateProcess()`. Аргументы [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) описаны ниже.211212*args* должен быть последовательностью аргументов программы или отдельной строкой. По умолчанию, если *args* является последовательностью, исполняемая программа – это первый элемент в *args*. Если *args* – строка, интерпретация зависит от платформы и описана ниже. Дополнительные отличия от поведения по умолчанию см. в аргументах *shell* и *executable*. Если не указано иное, рекомендуется передавать *args* как последовательность.213214На POSIX, если *args* – строка, она интерпретируется как имя или путь к программе для запуска. Однако это можно сделать только в том случае, если программе не передаются аргументы.215216> **Примечание**217>218> [`shlex.split()`](https://python-all.ru/3.6/library/shlex.html#shlex.split) может быть полезен при определении правильной токенизации для *args*, особенно в сложных случаях:219>220> ```python221> >>> import shlex, subprocess222> >>> command_line = input()223> /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"224> >>> args = shlex.split(command_line)225> >>> print(args)226> ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]227> >>> p = subprocess.Popen(args) # Успешно!228> ```229>230> Обратите внимание, что опции (такие как *-input*) и аргументы (такие как *eggs.txt*), разделённые пробелами в оболочке, помещаются в отдельные элементы списка, в то время как аргументы, требующие кавычек или обратной косой черты в оболочке (например, имена файлов, содержащие пробелы, или команда *echo*, показанная выше), являются отдельными элементами списка.231232На Windows, если *args* – последовательность, она будет преобразована в строку способом, описанным в разделе [Преобразование последовательности аргументов в строку на Windows](https://python-all.ru/3.6/library/subprocess.html#converting-argument-sequence). Это связано с тем, что базовая функция `CreateProcess()` работает со строками.233234Аргумент *shell* (по умолчанию `False`) определяет, нужно ли использовать оболочку в качестве исполняемой программы. Если *shell* равен `True`, рекомендуется передавать *args* в виде строки, а не последовательности.235236На POSIX с `shell=True` оболочка по умолчанию – `/bin/sh`. Если *args* – строка, она задаёт команду для выполнения через оболочку. Это означает, что строка должна быть оформлена точно так же, как если бы она была введена в командной строке оболочки. Например, это включает экранирование кавычками или обратной косой черты имён файлов с пробелами. Если *args* – последовательность, первый элемент задаёт строку команды, а все остальные элементы рассматриваются как дополнительные аргументы для самой оболочки. Иначе говоря, [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) эквивалентно:237238```python239Popen(['/bin/sh', '-c', args[0], args[1], ...])240```241242На Windows с `shell=True` переменная окружения `COMSPEC` задаёт оболочку по умолчанию. Указывать `shell=True` в Windows нужно только тогда, когда команда, которую требуется выполнить, встроена в оболочку (например, **dir** или **copy**). Для запуска пакетного файла или консольного исполняемого файла `shell=True` не требуется.243244> **Примечание**245>246> Перед использованием `shell=True` прочтите раздел [Рекомендации по безопасности](https://python-all.ru/3.6/library/subprocess.html#security-considerations).247248*bufsize* будет передан как соответствующий аргумент функции [`open()`](https://python-all.ru/3.6/library/functions.html#open) при создании файловых объектов каналов stdin/stdout/stderr:249250- `0` означает без буферизации (чтение и запись – один системный вызов, могут возвращать меньше данных, чем запрошено)251- `1` означает буферизацию по строкам (работает только при `universal_newlines=True`, т.е. в текстовом режиме)252- любое другое положительное значение означает использование буфера примерно такого размера253- отрицательное значение bufsize (по умолчанию) означает, что будет использовано системное значение по умолчанию io.DEFAULT\_BUFFER\_SIZE.254255Изменено в версии 3.3.1: *bufsize* теперь по умолчанию равен -1, чтобы включить буферизацию по умолчанию, как того ожидает большинство кода. В версиях до Python 3.2.4 и 3.3.1 по умолчанию ошибочно использовалось `0`, что означало отсутствие буферизации и допускало короткие чтения. Это было непреднамеренно и не соответствовало поведению Python 2, как ожидал большинство кода.256257Аргумент *executable* задаёт альтернативную программу для выполнения. Он требуется очень редко. Если `shell=False`, *executable* заменяет программу, указанную в *args*. Однако исходное значение *args* всё равно передаётся программе. Большинство программ воспринимают программу, указанную через *args*, как имя команды, которое может отличаться от фактически выполняемой программы. На POSIX имя из *args* становится отображаемым именем исполняемого файла в утилитах вроде **ps**. Если `shell=True`, на POSIX аргумент *executable* задаёт альтернативную оболочку вместо `/bin/sh`.258259*stdin*, *stdout* и *stderr* задают файловые дескрипторы стандартного ввода, стандартного вывода и стандартного вывода ошибок выполняемой программы соответственно. Допустимые значения: [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE), [`DEVNULL`](https://python-all.ru/3.6/library/subprocess.html#subprocess.DEVNULL), существующий файловый дескриптор (положительное целое число), существующий [файловый объект](https://python-all.ru/3.6/glossary.html#term-file-object) и `None`. [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE) указывает, что должен быть создан новый канал к дочернему процессу. [`DEVNULL`](https://python-all.ru/3.6/library/subprocess.html#subprocess.DEVNULL) указывает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.6/library/os.html#os.devnull). При настройках по умолчанию (`None`) перенаправление не выполняется; файловые дескрипторы дочернего процесса наследуются от родительского. Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr приложений должны быть направлены в тот же файловый дескриптор, что и для stdout.260261Если *preexec\_fn* задан как вызываемый объект, этот объект будет вызван в дочернем процессе непосредственно перед его выполнением. (Только POSIX)262263> **Предупреждение**264>265> Параметр *preexec\_fn* небезопасно использовать при наличии потоков в приложении. Дочерний процесс может зависнуть до вызова exec. Если его всё же нужно использовать, пусть он будет тривиальным! Сведите к минимуму количество вызываемых библиотек.266267> **Примечание**268>269> Если нужно изменить окружение для дочернего процесса, используйте параметр *env* вместо изменения в *preexec\_fn*. Параметр *start\_new\_session* может заменить ранее распространённое использование *preexec\_fn* для вызова os.setsid() в дочернем процессе.270271Если *close\_fds* равно True, все файловые дескрипторы, кроме `0`, `1` и `2`, будут закрыты перед выполнением дочернего процесса (только POSIX). Значение по умолчанию зависит от платформы: всегда True на POSIX. На Windows оно равно True, когда *stdin*/*stdout*/*stderr* равны [`None`](https://python-all.ru/3.6/library/constants.html#None), иначе False. На Windows, если *close\_fds* равно True, то дочерний процесс не унаследует ни один дескриптор. Обратите внимание, что в Windows нельзя установить *close\_fds* в True и одновременно перенаправлять стандартные дескрипторы, задавая *stdin*, *stdout* или *stderr*.272273Изменено в версии 3.2: Значение по умолчанию для *close\_fds* было изменено с [`False`](https://python-all.ru/3.6/library/constants.html#False) на то, что описано выше.274275*pass\_fds* – необязательная последовательность файловых дескрипторов, которые должны оставаться открытыми между родительским и дочерним процессами. Указание любого *pass\_fds* принуждает *close\_fds* принимать значение [`True`](https://python-all.ru/3.6/library/constants.html#True). (Только POSIX)276277Новое в версии 3.2: Добавлен параметр *pass\_fds*.278279Если *cwd* не равен `None`, функция изменяет рабочий каталог на *cwd* перед запуском дочернего процесса. *cwd* может быть объектом [`str`](https://python-all.ru/3.6/library/stdtypes.html#str) и [путь-подобным](https://python-all.ru/3.6/glossary.html#term-path-like-object). В частности, функция ищет *executable* (или первый элемент в *args*) относительно *cwd*, если путь к исполняемому файлу является относительным.280281Изменено в версии 3.6: Параметр *cwd* принимает [путь-подобный объект](https://python-all.ru/3.6/glossary.html#term-path-like-object).282283Если *restore\_signals* равен true (по умолчанию), все сигналы, которые Python установил в SIG\_IGN, восстанавливаются в SIG\_DFL в дочернем процессе перед exec. В настоящее время это включает сигналы SIGPIPE, SIGXFZ и SIGXFSZ. (Только POSIX)284285Изменено в версии 3.2: Добавлен *restore\_signals*.286287Если *start\_new\_session* равен true, системный вызов setsid() будет выполнен в дочернем процессе перед запуском подпроцесса. (только POSIX)288289Изменено в версии 3.2: добавлен *start\_new\_session*.290291Если *env* не равен `None`, он должен быть отображением (mapping), определяющим переменные окружения для нового процесса; они используются вместо поведения по умолчанию, заключающегося в наследовании окружения текущего процесса.292293> **Примечание**294>295> Если указано, *env* должен предоставить все переменные, необходимые для выполнения программы. В Windows для запуска [сборки side-by-side](https://python-all.ru/3.6/library/subprocess.html) указанный *env* **должен** включать корректный `SystemRoot`.296297Если указаны *encoding* или *errors*, файловые объекты *stdin*, *stdout* и *stderr* открываются в текстовом режиме с указанными encoding и *errors*, как описано выше в разделе [Часто используемые аргументы](https://python-all.ru/3.6/library/subprocess.html#frequently-used-arguments). Если *universal\_newlines* равно `True`, они открываются в текстовом режиме с кодировкой по умолчанию. В противном случае они открываются как двоичные потоки.298299Новое в версии 3.6: *encoding* и *errors* были добавлены.300301Если задан, *startupinfo* будет объектом [`STARTUPINFO`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO), который передаётся нижележащей функции `CreateProcess`. *creationflags*, если задан, может быть [`CREATE_NEW_CONSOLE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE) или [`CREATE_NEW_PROCESS_GROUP`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CREATE_NEW_PROCESS_GROUP) (только Windows).302303Объекты Popen поддерживаются как менеджеры контекста через оператор [`with`](https://python-all.ru/3.6/reference/compound_stmts.html#with): при выходе стандартные файловые дескрипторы закрываются, и процесс ожидается.304305```python306with Popen(["ifconfig"], stdout=PIPE) as proc:307 log.write(proc.stdout.read())308```309310Изменено в версии 3.2: добавлена поддержка менеджера контекста.311312Изменено в версии 3.6: деструктор Popen теперь выводит предупреждение [`ResourceWarning`](https://python-all.ru/3.6/library/exceptions.html#ResourceWarning), если дочерний процесс всё ещё выполняется.313314### 17.5.1.3. Исключения315316Исключения, возникающие в дочернем процессе до начала выполнения новой программы, будут повторно возбуждены в родительском процессе. Кроме того, объект исключения будет иметь дополнительный атрибут с именем `child_traceback`, который представляет собой строку, содержащую информацию о трассировке с точки зрения дочернего процесса.317318Наиболее часто вызываемое исключение – [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError). Оно возникает, например, при попытке выполнить несуществующий файл. Приложения должны быть готовы к исключениям [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError).319320[`ValueError`](https://python-all.ru/3.6/library/exceptions.html#ValueError) будет вызван, если [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) вызвана с недопустимыми аргументами.321322[`check_call()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.check_call) и [`check_output()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.check_output) вызовут [`CalledProcessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError), если вызванный процесс вернёт ненулевой код возврата.323324Все функции и методы, которые принимают параметр *тайм-аут*, например [`call()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.call) и [`Popen.communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate), будут возбуждать исключение [`TimeoutExpired`](https://python-all.ru/3.6/library/subprocess.html#subprocess.TimeoutExpired), если тайм-аут истекает до завершения процесса.325326Все исключения, определённые в этом модуле, наследуются от [`SubprocessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.SubprocessError).327328> Новое в версии 3.3: добавлен базовый класс [`SubprocessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.SubprocessError).329330## 17.5.2. Вопросы безопасности331332В отличие от некоторых других функций popen, данная реализация никогда не вызывает системную оболочку неявно. Это означает, что все символы, включая метасимволы оболочки, можно безопасно передавать дочерним процессам. Если оболочка вызывается явно через `shell=True`, приложение должно само позаботиться о том, чтобы все пробелы и метасимволы были правильно экранированы во избежание уязвимостей [внедрения команд оболочки](https://python-all.ru/3.6/library/subprocess.html).333334При использовании `shell=True` функция [`shlex.quote()`](https://python-all.ru/3.6/library/shlex.html#shlex.quote) может быть использована для правильного экранирования пробелов и метасимволов оболочки в строках, которые будут использоваться для построения команд оболочки.335336## 17.5.3. Объекты Popen337338Экземпляры класса [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) имеют следующие методы:339340#### `Popen.poll()`341342Проверяет, завершился ли дочерний процесс. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.returncode). В противном случае возвращает `None`.343344#### `Popen.wait(timeout=None)`345346Ожидает завершения дочернего процесса. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.returncode).347348Если процесс не завершается через *тайм-аут* секунд, возбуждается исключение [`TimeoutExpired`](https://python-all.ru/3.6/library/subprocess.html#subprocess.TimeoutExpired). Это исключение можно безопасно перехватить и повторить ожидание.349350> **Примечание**351>352> Это приведёт к взаимоблокировке при использовании `stdout=PIPE` или `stderr=PIPE` и когда дочерний процесс порождает достаточно выходных данных в канал, так что он блокируется в ожидании, когда буфер канала ОС примет больше данных. Используйте [`Popen.communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate) при работе с каналами, чтобы избежать этого.353354> **Примечание**355>356> Функция реализована с помощью busy-цикла (неблокирующий вызов и короткие паузы). Используйте модуль [`asyncio`](https://python-all.ru/3.6/library/asyncio.html#module-asyncio) для асинхронного ожидания: см. [`asyncio.create_subprocess_exec`](https://python-all.ru/3.6/library/asyncio-subprocess.html#asyncio.create_subprocess_exec).357358Изменено в версии 3.3: добавлен *timeout*.359360Устарело с версии 3.4: Не используйте параметр *endtime*. Он был случайно открыт в версии 3.3, но остался недокументированным, так как предполагался приватным для внутреннего использования. Вместо него используйте *timeout*.361362#### `Popen.communicate(input=None, timeout=None)`363364Взаимодействие с процессом: отправка данных в stdin. Чтение данных из stdout и stderr до достижения конца файла. Ожидание завершения процесса. Необязательный аргумент *input* должен содержать данные, отправляемые дочернему процессу, или `None`, если данные не отправляются. Если потоки были открыты в текстовом режиме, *input* должен быть строкой. В противном случае – байтами.365366[`communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate) возвращает кортеж `(stdout_data, stderr_data)`. Данные будут строками, если потоки были открыты в текстовом режиме; в противном случае – байтами.367368Обратите внимание: если вы хотите отправить данные в stdin процесса, необходимо создать объект Popen с `stdin=PIPE`. Аналогично, чтобы получить что-то, кроме `None`, в результирующем кортеже, нужно также передать `stdout=PIPE` и/или `stderr=PIPE`.369370Если процесс не завершится за *timeout* секунд, будет вызвано исключение [`TimeoutExpired`](https://python-all.ru/3.6/library/subprocess.html#subprocess.TimeoutExpired). Перехват этого исключения и повторное обращение к обмену данными не приведет к потере вывода.371372Дочерний процесс не уничтожается по истечении тайм-аута, поэтому для корректной очистки хорошо написанное приложение должно уничтожить дочерний процесс и завершить обмен данными:373374```python375proc = subprocess.Popen(...)376try:377 outs, errs = proc.communicate(timeout=15)378except TimeoutExpired:379 proc.kill()380 outs, errs = proc.communicate()381```382383> **Примечание**384>385> Прочитанные данные буферизуются в памяти, поэтому не используйте этот метод, если размер данных велик или неограничен.386387Изменено в версии 3.3: добавлен *timeout*.388389#### `Popen.send_signal(signal)`390391Отправляет сигнал *signal* дочернему процессу.392393> **Примечание**394>395> В Windows SIGTERM является псевдонимом для [`terminate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.terminate). CTRL\_C\_EVENT и CTRL\_BREAK\_EVENT можно отправлять процессам, запущенным с параметром *creationflags*, включающим *CREATE\_NEW\_PROCESS\_GROUP*.396397#### `Popen.terminate()`398399Останавливает дочерний процесс. В ОС POSIX метод отправляет SIGTERM дочернему процессу. В Windows для остановки дочернего процесса вызывается функция Win32 API `TerminateProcess()`.400401#### `Popen.kill()`402403Завершает дочерний процесс. В ОС POSIX функция отправляет SIGKILL дочернему процессу. В Windows [`kill()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.kill) является псевдонимом для [`terminate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.terminate).404405Также доступны следующие атрибуты:406407#### `Popen.args`408409Аргумент *args* в том виде, в котором он был передан в [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) – последовательность аргументов программы или одна строка.410411Новое в версии 3.3.412413#### `Popen.stdin`414415Если аргумент *stdin* был [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE), этот атрибут является доступным для записи потоковым объектом, возвращаемым [`open()`](https://python-all.ru/3.6/library/functions.html#open). Если были указаны аргументы *encoding* или *errors* или аргумент *universal\_newlines* был `True`, поток является текстовым, в противном случае – байтовым. Если аргумент *stdin* не был [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.416417#### `Popen.stdout`418419Если аргумент *stdout* был [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE), этот атрибут является доступным для чтения потоковым объектом, возвращаемым [`open()`](https://python-all.ru/3.6/library/functions.html#open). Чтение из потока предоставляет вывод дочернего процесса. Если были указаны аргументы *encoding* или *errors* или аргумент *universal\_newlines* был `True`, поток является текстовым, в противном случае – байтовым. Если аргумент *stdout* не был [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.420421#### `Popen.stderr`422423Если аргумент *stderr* был [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE), этот атрибут является доступным для чтения потоковым объектом, возвращаемым [`open()`](https://python-all.ru/3.6/library/functions.html#open). Чтение из потока предоставляет вывод ошибок дочернего процесса. Если были указаны аргументы *encoding* или *errors* или аргумент *universal\_newlines* был `True`, поток является текстовым, в противном случае – байтовым. Если аргумент *stderr* не был [`PIPE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.424425> **Предупреждение**426>427> Используйте [`communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate) вместо [`.stdin.write`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.stdin), [`.stdout.read`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.stdout) или [`.stderr.read`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.stderr), чтобы избежать взаимоблокировок из-за переполнения буферов каналов ОС и блокировки дочернего процесса.428429#### `Popen.pid`430431PID дочернего процесса.432433Обратите внимание: если аргумент *shell* установлен в `True`, это PID запущенной оболочки.434435#### `Popen.returncode`436437Код возврата дочернего процесса, устанавливаемый методами [`poll()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.poll) и [`wait()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.wait) (а косвенно – [`communicate()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.communicate)). Значение `None` указывает, что процесс ещё не завершён.438439Отрицательное значение `-N` указывает, что дочерний процесс был завершён сигналом `N` (только POSIX).440441## 17.5.4. Вспомогательные функции Popen для Windows442443Класс [`STARTUPINFO`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO) и следующие константы доступны только в Windows.444445#### `class subprocess.STARTUPINFO`446447Частичная поддержка структуры Windows [STARTUPINFO](https://python-all.ru/3.6/library/subprocess.html) используется для создания [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen).448449#### `dwFlags`450451Битовое поле, определяющее, используются ли определённые атрибуты [`STARTUPINFO`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO) при создании окна процессом.452453```python454si = subprocess.STARTUPINFO()455si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW456```457458#### `hStdInput`459460Если [`dwFlags`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного ввода процесса. Если [`STARTF_USESTDHANDLES`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTF_USESTDHANDLES) не указан, по умолчанию для стандартного ввода используется буфер клавиатуры.461462#### `hStdOutput`463464Если [`dwFlags`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного вывода процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартного вывода используется буфер окна консоли.465466#### `hStdError`467468Если [`dwFlags`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного вывода ошибок процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартного вывода ошибок используется буфер окна консоли.469470#### `wShowWindow`471472Если в [`dwFlags`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указан [`STARTF_USESHOWWINDOW`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTF_USESHOWWINDOW), этот атрибут может принимать любое значение, которое можно указать в параметре `nCmdShow` для функции [ShowWindow](https://python-all.ru/3.6/library/subprocess.html), за исключением `SW_SHOWDEFAULT`. В противном случае этот атрибут игнорируется.473474Для этого атрибута предоставляется [`SW_HIDE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.SW_HIDE). Он используется, когда [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) вызывается с `shell=True`.475476### 17.5.4.1. Константы477478Модуль [`subprocess`](https://python-all.ru/3.6/library/subprocess.html#module-subprocess) предоставляет следующие константы.479480#### `subprocess.STD_INPUT_HANDLE`481482Устройство стандартного ввода. Изначально это буфер консольного ввода, `CONIN$`.483484#### `subprocess.STD_OUTPUT_HANDLE`485486Устройство стандартного вывода. Изначально это активный буфер консольного экрана, `CONOUT$`.487488#### `subprocess.STD_ERROR_HANDLE`489490Устройство стандартного вывода ошибок. Изначально это активный буфер консольного экрана, `CONOUT$`.491492#### `subprocess.SW_HIDE`493494Скрывает окно. Другое окно будет активировано.495496#### `subprocess.STARTF_USESTDHANDLES`497498Указывает, что атрибуты [`STARTUPINFO.hStdInput`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO.hStdInput), [`STARTUPINFO.hStdOutput`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO.hStdOutput) и [`STARTUPINFO.hStdError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO.hStdError) содержат дополнительную информацию.499500#### `subprocess.STARTF_USESHOWWINDOW`501502Указывает, что атрибут [`STARTUPINFO.wShowWindow`](https://python-all.ru/3.6/library/subprocess.html#subprocess.STARTUPINFO.wShowWindow) содержит дополнительную информацию.503504#### `subprocess.CREATE_NEW_CONSOLE`505506Новый процесс получает новую консоль вместо наследования консоли родителя (по умолчанию).507508#### `subprocess.CREATE_NEW_PROCESS_GROUP`509510Параметр [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что будет создана новая группа процессов. Этот флаг необходим для использования [`os.kill()`](https://python-all.ru/3.6/library/os.html#os.kill) в подпроцессе.511512Этот флаг игнорируется, если указан [`CREATE_NEW_CONSOLE`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE).513514## 17.5.5. Устаревший высокоуровневый API515516До Python 3.5 эти три функции представляли собой высокоуровневый API для subprocess. Теперь во многих случаях можно использовать [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run), но значительная часть существующего кода по-прежнему вызывает эти функции.517518#### `subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)`519520Запускает команду, описанную параметром *args*. Ожидает завершения команды и затем возвращает атрибут [`returncode`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.returncode).521522Это эквивалентно:523524```python525run(...).returncode526```527528(за исключением того, что параметры *input* и *check* не поддерживаются)529530Показанные выше аргументы – лишь самые распространённые. Полная сигнатура функции в основном совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) – эта функция передаёт все переданные аргументы, кроме *timeout*, напрямую в этот интерфейс.531532> **Примечание**533>534> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией. Дочерний процесс будет заблокирован, если он выдаст в канал достаточно данных, чтобы заполнить буфер канала ОС, поскольку каналы не читаются.535536Изменено в версии 3.3: добавлен *timeout*.537538#### `subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)`539540Выполняет команду с аргументами. Ожидает завершения команды. Если код возврата равен нулю, возвращает результат, иначе вызывает [`CalledProcessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError). Объект [`CalledProcessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError) будет содержать код возврата в атрибуте [`returncode`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError.returncode).541542Это эквивалентно:543544```python545run(..., check=True)546```547548(за исключением того, что параметр *input* не поддерживается)549550Показанные выше аргументы – лишь самые распространённые. Полная сигнатура функции в основном совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) – эта функция передаёт все переданные аргументы, кроме *timeout*, напрямую в этот интерфейс.551552> **Примечание**553>554> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией. Дочерний процесс будет заблокирован, если он выдаст в канал достаточно данных, чтобы заполнить буфер канала ОС, поскольку каналы не читаются.555556Изменено в версии 3.3: добавлен *timeout*.557558#### `subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=False, timeout=None)`559560Выполняет команду с аргументами и возвращает её вывод.561562Если код возврата был ненулевым, возбуждается исключение [`CalledProcessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError). Объект [`CalledProcessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError) будет содержать код возврата в атрибуте [`returncode`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError.returncode), а вывод – в атрибуте [`output`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError.output).563564Это эквивалентно:565566```python567run(..., check=True, stdout=PIPE).stdout568```569570Показанные выше аргументы – лишь самые распространённые. Полная сигнатура функции в основном та же, что и у [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run) – большинство аргументов передаются напрямую в этот интерфейс. Однако явная передача `input=None` для наследования дескриптора стандартного ввода родительского процесса не поддерживается.571572По умолчанию эта функция возвращает данные в виде закодированных байтов. Фактическая кодировка выходных данных может зависеть от вызываемой команды, поэтому декодирование в текст часто приходится выполнять на уровне приложения.573574Это поведение можно переопределить, установив *universal\_newlines* в `True`, как описано выше в разделе [Часто используемые аргументы](https://python-all.ru/3.6/library/subprocess.html#frequently-used-arguments).575576Чтобы также захватывать стандартный поток ошибок в результате, используйте `stderr=subprocess.STDOUT`:577578```python579>>> subprocess.check_output(580... "ls non_existent_file; exit 0",581... stderr=subprocess.STDOUT,582... shell=True)583'ls: non_existent_file: No such file or directory\n'584```585586Новое в версии 3.1.587588Изменено в версии 3.3: добавлен *timeout*.589590Изменено в версии 3.4: добавлена поддержка именованного аргумента *input*.591592Изменено в версии 3.6: добавлены *encoding* и *errors*. Подробнее см. [`run()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.run).593594## 17.5.6. Замена старых функций на модуль [`subprocess`](https://python-all.ru/3.6/library/subprocess.html#module-subprocess)595596В этом разделе «a становится b» означает, что b можно использовать как замену для a.597598> **Примечание**599>600> Все функции вида «a» в этом разделе завершаются ошибкой (более или менее) молча, если выполняемая программа не найдена; замены «b» вместо этого возбуждают [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError).601>602> Кроме того, замены, использующие [`check_output()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.check_output), будут завершаться ошибкой с [`CalledProcessError`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError), если запрошенная операция возвращает ненулевой код возврата. Вывод по-прежнему доступен как атрибут [`output`](https://python-all.ru/3.6/library/subprocess.html#subprocess.CalledProcessError.output) возбуждённого исключения.603604В следующих примерах предполагается, что соответствующие функции уже импортированы из модуля [`subprocess`](https://python-all.ru/3.6/library/subprocess.html#module-subprocess).605606### 17.5.6.1. Замена обратных кавычек оболочки /bin/sh607608```bash609output=`mycmd myarg`610```611612становится:613614```python615output = check_output(["mycmd", "myarg"])616```617618### 17.5.6.2. Замена конвейера оболочки619620```bash621output=`dmesg | grep hda`622```623624становится:625626```python627p1 = Popen(["dmesg"], stdout=PIPE)628p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)629p1.stdout.close() # Разрешить p1 получать SIGPIPE, если p2 завершается.630output = p2.communicate()[0]631```632633Вызов p1.stdout.close() после запуска p2 важен для того, чтобы p1 получил SIGPIPE, если p2 завершится раньше p1.634635В качестве альтернативы, для доверенного ввода можно по-прежнему напрямую использовать встроенную поддержку конвейеров оболочки:636637```bash638output=`dmesg | grep hda`639```640641становится:642643```python644output=check_output("dmesg | grep hda", shell=True)645```646647### 17.5.6.3. Замена [`os.system()`](https://python-all.ru/3.6/library/os.html#os.system)648649```python650sts = os.system("mycmd" + " myarg")651# становится652sts = call("mycmd" + " myarg", shell=True)653```654655Примечания:656657- Вызов программы через оболочку обычно не требуется.658659Более реалистичный пример выглядит так:660661```python662try:663 retcode = call("mycmd" + " myarg", shell=True)664 if retcode < 0:665 print("Child was terminated by signal", -retcode, file=sys.stderr)666 else:667 print("Child returned", retcode, file=sys.stderr)668except OSError as e:669 print("Execution failed:", e, file=sys.stderr)670```671672### 17.5.6.4. Замена семейства [`os.spawn`](https://python-all.ru/3.6/library/os.html#os.spawnl)673674Пример P\_NOWAIT:675676```python677pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")678==>679pid = Popen(["/bin/mycmd", "myarg"]).pid680```681682Пример P\_WAIT:683684```python685retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")686==>687retcode = call(["/bin/mycmd", "myarg"])688```689690Пример с вектором:691692```python693os.spawnvp(os.P_NOWAIT, path, args)694==>695Popen([path] + args[1:])696```697698Пример с окружением:699700```python701os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)702==>703Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})704```705706### 17.5.6.5. Замена [`os.popen()`](https://python-all.ru/3.6/library/os.html#os.popen), `os.popen2()`, `os.popen3()`707708```python709(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)710==>711p = Popen(cmd, shell=True, bufsize=bufsize,712 stdin=PIPE, stdout=PIPE, close_fds=True)713(child_stdin, child_stdout) = (p.stdin, p.stdout)714```715716```python717(child_stdin,718 child_stdout,719 child_stderr) = os.popen3(cmd, mode, bufsize)720==>721p = Popen(cmd, shell=True, bufsize=bufsize,722 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)723(child_stdin,724 child_stdout,725 child_stderr) = (p.stdin, p.stdout, p.stderr)726```727728```python729(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)730==>731p = Popen(cmd, shell=True, bufsize=bufsize,732 stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)733(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)734```735736Обработка кода возврата выполняется следующим образом:737738```python739pipe = os.popen(cmd, 'w')740...741rc = pipe.close()742if rc is not None and rc >> 8:743 print("There were some errors")744==>745process = Popen(cmd, stdin=PIPE)746...747process.stdin.close()748if process.wait() != 0:749 print("There were some errors")750```751752### 17.5.6.6. Замена функций из модуля `popen2`753754> **Примечание**755>756> Если аргумент cmd функций popen2 является строкой, команда выполняется через /bin/sh. Если это список, команда выполняется напрямую.757758```python759(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)760==>761p = Popen("somestring", shell=True, bufsize=bufsize,762 stdin=PIPE, stdout=PIPE, close_fds=True)763(child_stdout, child_stdin) = (p.stdout, p.stdin)764```765766```python767(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)768==>769p = Popen(["mycmd", "myarg"], bufsize=bufsize,770 stdin=PIPE, stdout=PIPE, close_fds=True)771(child_stdout, child_stdin) = (p.stdout, p.stdin)772```773774`popen2.Popen3` и `popen2.Popen4` в основном работают как [`subprocess.Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen), за исключением того, что:775776- [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen) вызывает исключение, если выполнение завершается неудачей.777- аргумент *capturestderr* заменён аргументом *stderr*.778- `stdin=PIPE` и `stdout=PIPE` должны быть указаны.779- popen2 по умолчанию закрывает все файловые дескрипторы, но необходимо указать `close_fds=True` с [`Popen`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen), чтобы гарантировать такое поведение на всех платформах или в старых версиях Python.780781## 17.5.7. Устаревшие функции вызова оболочки782783Этот модуль также предоставляет следующие устаревшие функции из модуля `commands` версии 2.x. Эти операции неявно вызывают системную оболочку, и ни одно из описанных выше гарантий безопасности и согласованности обработки исключений не действует для этих функций.784785#### `subprocess.getstatusoutput(cmd)`786787Возвращает `(exitcode, output)` выполнения *cmd* в оболочке.788789Выполняет строку *cmd* в оболочке с `Popen.check_output()` и возвращает кортеж из двух элементов `(exitcode, output)`. Используется кодировка локали; подробнее см. примечания к [Часто используемые аргументы](https://python-all.ru/3.6/library/subprocess.html#frequently-used-arguments).790791Завершающий символ новой строки удаляется из вывода. Код завершения команды можно интерпретировать как код возврата подпроцесса. Пример:792793```python794>>> subprocess.getstatusoutput('ls /bin/ls')795(0, '/bin/ls')796>>> subprocess.getstatusoutput('cat /bin/junk')797(1, 'cat: /bin/junk: No such file or directory')798>>> subprocess.getstatusoutput('/bin/junk')799(127, 'sh: /bin/junk: not found')800>>> subprocess.getstatusoutput('/bin/kill $$')801(-15, '')802```803804Доступность: POSIX и Windows805806Изменено в версии 3.3.4: Добавлена поддержка Windows.807808Теперь функция возвращает (exitcode, output) вместо (status, output), как это было в Python 3.3.3 и более ранних версиях. exitcode имеет то же значение, что и [`returncode`](https://python-all.ru/3.6/library/subprocess.html#subprocess.Popen.returncode).809810#### `subprocess.getoutput(cmd)`811812Возвращает вывод (stdout и stderr) выполнения *cmd* в оболочке.813814Как [`getstatusoutput()`](https://python-all.ru/3.6/library/subprocess.html#subprocess.getstatusoutput), за исключением того, что код завершения игнорируется, а возвращаемое значение – строка, содержащая вывод команды. Пример:815816```python817>>> subprocess.getoutput('ls /bin/ls')818'/bin/ls'819```820821Доступность: POSIX и Windows822823Изменено в версии 3.3.4: Добавлена поддержка Windows824825## 17.5.8. Примечания826827### 17.5.8.1. Преобразование последовательности аргументов в строку в Windows828829В Windows последовательность *args* преобразуется в строку, которая может быть разобрана с помощью следующих правил (которые соответствуют правилам, используемым в MS C runtime):8308311. Аргументы разделяются пробельными символами, то есть пробелом или табуляцией.8322. Строка, заключённая в двойные кавычки, интерпретируется как один аргумент, независимо от пробельных символов внутри неё. Строка в кавычках может быть встроена в аргумент.8333. Двойная кавычка, перед которой стоит обратная косая черта, интерпретируется как литеральная двойная кавычка.8344. Обратные косые черты интерпретируются буквально, если только они не стоят непосредственно перед двойной кавычкой.8355. Если обратные косые черты стоят непосредственно перед двойной кавычкой, каждая пара обратных косых черт интерпретируется как литеральная обратная косая черта. Если количество обратных косых черт нечётное, последняя обратная косая черта экранирует следующую за ней двойную кавычку, как описано в правиле 3.836837> **См. также**838>839> **[`shlex`](https://python-all.ru/3.6/library/shlex.html#module-shlex)**840>841> Модуль, предоставляющий функцию для разбора и экранирования командных строк.842