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

subprocess.md

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

1> **Источник:** https://python-all.ru/3.4/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.4/library/subprocess.html#module-subprocess) – Управление подпроцессами89Модуль [`subprocess`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess) позволяет порождать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать коды возврата. Этот модуль призван заменить несколько более старых модулей и функций:1011```python12os.system13os.spawn*14```1516Информация о том, как модуль [`subprocess`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess) может использоваться для замены этих модулей и функций, приведена в следующих разделах.1718> **См. также**19>20> [**PEP 324**](https://python-all.ru/3.4/library/subprocess.html) – PEP, предлагающий модуль подпроцесса2122## 17.5.1. Использование модуля [`subprocess`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess)2324Рекомендуемый способ запуска подпроцессов – использовать следующие удобные функции во всех случаях, где они применимы. Для более сложных случаев можно напрямую использовать низкоуровневый интерфейс [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen).2526#### `subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)`2728Выполняет команду, описанную аргументом *args*. Ожидает завершения команды, затем возвращает атрибут `returncode`.2930Аргументы, перечисленные выше, являются лишь наиболее распространёнными; они описаны ниже в разделе [*Часто используемые аргументы*](https://python-all.ru/3.4/library/subprocess.html#frequently-used-arguments) (отсюда использование нотации только ключевых слов в сокращённой сигнатуре). Полная сигнатура функции в значительной степени совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) – эта функция передаёт все указанные аргументы, кроме *timeout*, напрямую этому интерфейсу.3132Аргумент *timeout* передаётся в [`Popen.wait()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.wait). Если время ожидания истекает, дочерний процесс будет убит, после чего ожидание повторяется. Исключение [`TimeoutExpired`](https://python-all.ru/3.4/library/subprocess.html#subprocess.TimeoutExpired) будет возбуждено повторно после завершения дочернего процесса.3334Примеры:3536```python37>>> subprocess.call(["ls", "-l"])3803940>>> subprocess.call("exit 1", shell=True)41142```4344> **Примечание**45>46> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией. Дочерний процесс заблокируется, если он сгенерирует достаточно вывода в канал, чтобы заполнить буфер канала ОС, поскольку каналы не читаются.4748Изменено в версии 3.3: добавлен *timeout*.4950#### `subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)`5152Выполняет команду с аргументами. Ожидает завершения команды. Если код возврата равен нулю, возвращает управление, иначе возбуждает [`CalledProcessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError). Объект [`CalledProcessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError) будет содержать код возврата в атрибуте [`returncode`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError.returncode).5354Аргументы, перечисленные выше, являются лишь наиболее распространёнными; они описаны ниже в разделе [*Часто используемые аргументы*](https://python-all.ru/3.4/library/subprocess.html#frequently-used-arguments) (отсюда использование нотации только ключевых слов в сокращённой сигнатуре). Полная сигнатура функции в значительной степени совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) – эта функция передаёт все указанные аргументы, кроме *timeout*, напрямую этому интерфейсу.5556Аргумент *timeout* передаётся в [`Popen.wait()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.wait). Если время ожидания истекает, дочерний процесс будет убит, после чего ожидание повторяется. Исключение [`TimeoutExpired`](https://python-all.ru/3.4/library/subprocess.html#subprocess.TimeoutExpired) будет возбуждено повторно после завершения дочернего процесса.5758Примеры:5960```python61>>> subprocess.check_call(["ls", "-l"])6206364>>> subprocess.check_call("exit 1", shell=True)65Traceback (most recent call last):66   ...67subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 168```6970> **Примечание**71>72> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией. Дочерний процесс заблокируется, если он сгенерирует достаточно вывода в канал, чтобы заполнить буфер канала ОС, поскольку каналы не читаются.7374Изменено в версии 3.3: добавлен *timeout*.7576#### `subprocess.check_output(args, *, input=None, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)`7778Выполняет команду с аргументами и возвращает её вывод.7980Если код возврата был ненулевым, возбуждается исключение [`CalledProcessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError). Объект [`CalledProcessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError) будет содержать код возврата в атрибуте [`returncode`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError.returncode) и весь вывод в атрибуте [`output`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError.output).8182Аргументы, перечисленные выше, являются лишь наиболее распространёнными; они описаны ниже в разделе [*Часто используемые аргументы*](https://python-all.ru/3.4/library/subprocess.html#frequently-used-arguments) (отсюда использование нотации только ключевых слов в сокращённой сигнатуре). Полная сигнатура функции в значительной степени совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) – эта функция передаёт все указанные аргументы, кроме *input* и *timeout*, напрямую этому интерфейсу. Кроме того, *stdout* не допускается в качестве аргумента, так как он используется внутренне для сбора вывода от подпроцесса.8384Аргумент *timeout* передаётся в [`Popen.wait()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.wait). Если время ожидания истекает, дочерний процесс будет убит, после чего ожидание повторяется. Исключение [`TimeoutExpired`](https://python-all.ru/3.4/library/subprocess.html#subprocess.TimeoutExpired) будет возбуждено повторно после завершения дочернего процесса.8586Аргумент *input* передаётся в [`Popen.communicate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.communicate) и, таким образом, в stdin подпроцесса. Если он используется, он должен быть последовательностью байтов или строкой, если задано `universal_newlines=True`. При использовании внутренний объект [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) автоматически создаётся с `stdin=PIPE`, и аргумент *stdin* также не может быть использован.8788Примеры:8990```python91>>> subprocess.check_output(["echo", "Hello World!"])92b'Hello World!\n'9394>>> subprocess.check_output(["echo", "Hello World!"], universal_newlines=True)95'Hello World!\n'9697>>> subprocess.check_output(["sed", "-e", "s/foo/bar/"],98...                         input=b"when in the course of fooman events\n")99b'when in the course of barman events\n'100101>>> subprocess.check_output("exit 1", shell=True)102Traceback (most recent call last):103   ...104subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1105```106107По умолчанию эта функция возвращает данные в виде закодированных байтов. Фактическая кодировка выходных данных может зависеть от вызываемой команды, поэтому декодирование в текст часто приходится выполнять на уровне приложения.108109Это поведение можно переопределить, установив *universal\_newlines* в `True`, как описано ниже в разделе [*Часто используемые аргументы*](https://python-all.ru/3.4/library/subprocess.html#frequently-used-arguments).110111Чтобы также захватить стандартный поток ошибок в результате, используйте `stderr=subprocess.STDOUT`:112113```python114>>> subprocess.check_output(115...     "ls non_existent_file; exit 0",116...     stderr=subprocess.STDOUT,117...     shell=True)118'ls: non_existent_file: No such file or directory\n'119```120121> **Примечание**122>123> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией. Дочерний процесс заблокируется, если он сгенерирует достаточно вывода в канал, чтобы заполнить буфер канала ОС, поскольку каналы не читаются.124125Новое в версии 3.1.126127Изменено в версии 3.3: добавлен *timeout*.128129Изменено в версии 3.4: *input* был добавлен.130131#### `subprocess.DEVNULL`132133Специальное значение, которое может использоваться в качестве аргумента *stdin*, *stdout* или *stderr* для [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) и указывает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.4/library/os.html#os.devnull).134135Новое в версии 3.3.136137#### `subprocess.PIPE`138139Специальное значение, которое может использоваться в качестве аргумента *stdin*, *stdout* или *stderr* для [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) и указывает, что должен быть открыт канал к стандартному потоку. Наиболее полезно с [`Popen.communicate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.communicate).140141#### `subprocess.STDOUT`142143Специальное значение, которое может использоваться в качестве аргумента *stderr* для [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) и указывает, что стандартный поток ошибок должен направляться в тот же дескриптор, что и стандартный вывод.144145#### `exception subprocess.SubprocessError`146147Базовый класс для всех остальных исключений из этого модуля.148149Новое в версии 3.3.150151#### `exception subprocess.TimeoutExpired`152153Подкласс [`SubprocessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.SubprocessError), возникающий при истечении тайм-аута в ожидании дочернего процесса.154155#### `cmd`156157Команда, которая использовалась для запуска дочернего процесса.158159#### `timeout`160161Тайм-аут в секундах.162163#### `output`164165Вывод дочернего процесса, если это исключение вызвано [`check_output()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.check_output). В противном случае – `None`.166167Новое в версии 3.3.168169#### `exception subprocess.CalledProcessError`170171Подкласс [`SubprocessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.SubprocessError), возникающий, когда процесс, запущенный [`check_call()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.check_call) или [`check_output()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.check_output), возвращает ненулевой код возврата.172173#### `returncode`174175Код возврата дочернего процесса.176177#### `cmd`178179Команда, которая использовалась для запуска дочернего процесса.180181#### `output`182183Вывод дочернего процесса, если это исключение вызвано [`check_output()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.check_output). В противном случае – `None`.184185### 17.5.1.1. Часто используемые аргументы186187Для поддержки широкого круга сценариев использования конструктор [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) (и удобные функции) принимают большое количество необязательных аргументов. В большинстве типичных случаев многие из этих аргументов можно смело оставить со значениями по умолчанию. Наиболее часто требуемые аргументы:188189> *args* обязателен для всех вызовов и должен быть строкой или последовательностью аргументов программы. Передача последовательности аргументов, как правило, предпочтительнее, поскольку позволяет модулю позаботиться о необходимом экранировании и кавычках (например, для пробелов в именах файлов). Если передаётся одна строка, то либо *shell* должен быть [`True`](https://python-all.ru/3.4/library/constants.html#True) (см. ниже), либо строка должна просто задавать имя исполняемой программы без указания аргументов.190>191> *stdin*, *stdout* и *stderr* задают дескрипторы стандартного ввода, стандартного вывода и стандартного вывода ошибок выполняемой программы. Допустимые значения: [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE), [`DEVNULL`](https://python-all.ru/3.4/library/subprocess.html#subprocess.DEVNULL), существующий файловый дескриптор (положительное целое число), существующий файловый объект и `None`. [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE) означает, что следует создать новый канал к дочернему процессу. [`DEVNULL`](https://python-all.ru/3.4/library/subprocess.html#subprocess.DEVNULL) означает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.4/library/os.html#os.devnull). При настройках по умолчанию (`None`) перенаправление не происходит; дескрипторы файлов дочернего процесса наследуются от родительского. Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr дочернего процесса должны быть направлены в тот же дескриптор, что и *stdout*.192>193> Если *universal\_newlines* равен `False`, файловые объекты *stdin*, *stdout* и *stderr* открываются как бинарные потоки, и преобразование концов строк не выполняется.194>195> Если *universal\_newlines* равен `True`, эти файловые объекты открываются как текстовые потоки в режиме [*universal newlines*](https://python-all.ru/3.4/glossary.html#term-universal-newlines) с использованием кодировки, возвращаемой [`locale.getpreferredencoding(False)`](https://python-all.ru/3.4/library/locale.html#locale.getpreferredencoding). Для *stdin* символы конца строки `'\n'` во входных данных преобразуются в разделитель строк по умолчанию [`os.linesep`](https://python-all.ru/3.4/library/os.html#os.linesep). Для *stdout* и *stderr* все концы строк в выводе преобразуются в `'\n'`. Дополнительную информацию см. в документации класса [`io.TextIOWrapper`](https://python-all.ru/3.4/library/io.html#io.TextIOWrapper), когда аргумент *newline* его конструктора равен `None`.196>197> > **Примечание**198> >199> > Атрибут newlines файловых объектов [`Popen.stdin`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.stdin), [`Popen.stdout`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.stdout) и [`Popen.stderr`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.stderr) не обновляется методом [`Popen.communicate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.communicate).200>201> Если *shell* равен `True`, указанная команда будет выполняться через оболочку. Это может быть полезно, если Python используется в первую очередь из-за улучшенного управления потоком выполнения по сравнению с большинством системных оболочек, и при этом нужен удобный доступ к другим возможностям оболочки, таким как конвейеры, маски имён файлов, подстановка переменных окружения и подстановка `~` в домашний каталог пользователя. Однако следует отметить, что сам Python предоставляет реализации многих возможностей, похожих на оболочку (в частности, [`glob`](https://python-all.ru/3.4/library/glob.html#module-glob), [`fnmatch`](https://python-all.ru/3.4/library/fnmatch.html#module-fnmatch), [`os.walk()`](https://python-all.ru/3.4/library/os.html#os.walk), [`os.path.expandvars()`](https://python-all.ru/3.4/library/os.path.html#os.path.expandvars), [`os.path.expanduser()`](https://python-all.ru/3.4/library/os.path.html#os.path.expanduser) и [`shutil`](https://python-all.ru/3.4/library/shutil.html#module-shutil)).202>203> Изменено в версии 3.3: Когда *universal\_newlines* равен `True`, класс использует кодировку [`locale.getpreferredencoding(False)`](https://python-all.ru/3.4/library/locale.html#locale.getpreferredencoding) вместо `locale.getpreferredencoding()`. Подробнее об этом изменении см. в документации класса [`io.TextIOWrapper`](https://python-all.ru/3.4/library/io.html#io.TextIOWrapper).204>205> > **Примечание**206> >207> > Прочтите раздел [Вопросы безопасности](https://python-all.ru/3.4/library/subprocess.html#security-considerations) перед использованием `shell=True`.208209Эти параметры, как и все остальные, более подробно описаны в документации конструктора [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen).210211### 17.5.1.2. Конструктор Popen212213Создание и управление процессами в этом модуле осуществляется классом [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen). Он предоставляет большую гибкость, позволяя разработчикам обрабатывать менее распространённые случаи, не охваченные удобными функциями.214215#### `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=())`216217Выполняет дочернюю программу в новом процессе. На POSIX класс использует поведение, подобное [`os.execvp()`](https://python-all.ru/3.4/library/os.html#os.execvp), для запуска дочерней программы. На Windows класс использует функцию Windows `CreateProcess()`. Аргументы [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) следующие.218219*args* должен быть последовательностью аргументов программы или отдельной строкой. По умолчанию, если *args* является последовательностью, исполняемая программа – это первый элемент в *args*. Если *args* – строка, интерпретация зависит от платформы и описана ниже. Дополнительные отличия от поведения по умолчанию см. в аргументах *shell* и *executable*. Если не указано иное, рекомендуется передавать *args* как последовательность.220221На POSIX, если *args* – строка, она интерпретируется как имя или путь к программе для запуска. Однако это можно сделать только в том случае, если программе не передаются аргументы.222223> **Примечание**224>225> [`shlex.split()`](https://python-all.ru/3.4/library/shlex.html#shlex.split) может быть полезен при определении правильной токенизации *args*, особенно в сложных случаях:226>227> ```python228> >>> import shlex, subprocess229> >>> command_line = input()230> /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"231> >>> args = shlex.split(command_line)232> >>> print(args)233> ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]234> >>> p = subprocess.Popen(args) # Успешно!235> ```236>237> Обратите внимание, что опции (такие как *-input*) и аргументы (такие как *eggs.txt*), разделённые пробелами в оболочке, помещаются в отдельные элементы списка, в то время как аргументы, требующие кавычек или обратной косой черты в оболочке (например, имена файлов, содержащие пробелы, или команда *echo*, показанная выше), являются отдельными элементами списка.238239В Windows, если *args* является последовательностью, она будет преобразована в строку способом, описанным в разделе [*Преобразование последовательности аргументов в строку в Windows*](https://python-all.ru/3.4/library/subprocess.html#converting-argument-sequence). Это связано с тем, что базовая функция `CreateProcess()` работает со строками.240241Аргумент *shell* (по умолчанию *False*) указывает, следует ли использовать оболочку в качестве выполняемой программы. Если *shell* равен *True*, рекомендуется передавать *args* в виде строки, а не последовательности.242243На POSIX с `shell=True` оболочкой по умолчанию является `/bin/sh`. Если *args* – строка, то эта строка задаёт команду для выполнения через оболочку. Это означает, что строка должна быть отформатирована точно так же, как если бы она была введена в командной строке оболочки. Это включает, например, экранирование кавычками или обратной косой чертой имён файлов, содержащих пробелы. Если *args* – последовательность, первый элемент задаёт строку команды, а все дополнительные элементы рассматриваются как дополнительные аргументы самой оболочки. То есть [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) делает эквивалент:244245```python246Popen(['/bin/sh', '-c', args[0], args[1], ...])247```248249В Windows с `shell=True` переменная окружения `COMSPEC` задаёт оболочку по умолчанию. Единственный случай, когда нужно указывать `shell=True` в Windows – это когда команда, которую требуется выполнить, встроена в оболочку (например, **dir** или **copy**). Для запуска пакетного файла или консольного исполняемого файла `shell=True` не требуется.250251> **Примечание**252>253> Прочтите раздел [Вопросы безопасности](https://python-all.ru/3.4/library/subprocess.html#security-considerations) перед использованием `shell=True`.254255*bufsize* будет передан как соответствующий аргумент функции [`open()`](https://python-all.ru/3.4/library/functions.html#open) при создании файловых объектов каналов stdin/stdout/stderr:256257- `0` означает без буферизации (чтение и запись – один системный вызов, могут возвращать меньше данных, чем запрошено)258- `1` означает буферизацию по строкам (работает только если `universal_newlines=True`, т.е. в текстовом режиме)259- любое другое положительное значение означает использование буфера примерно такого размера260- отрицательное значение bufsize (по умолчанию) означает, что будет использовано системное значение по умолчанию io.DEFAULT\_BUFFER\_SIZE.261262Изменено в версии 3.3.1: *bufsize* теперь по умолчанию равен -1, чтобы включить буферизацию по умолчанию, как того ожидает большинство кода. В версиях до Python 3.2.4 и 3.3.1 по умолчанию ошибочно использовалось `0`, что означало отсутствие буферизации и допускало короткие чтения. Это было непреднамеренно и не соответствовало поведению Python 2, как ожидал большинство кода.263264Аргумент *executable* задаёт заменяющую программу для выполнения. Он требуется крайне редко. Если `shell=False`, то *executable* заменяет программу, указанную в *args*. Однако исходный *args* всё равно передаётся программе. Большинство программ воспринимают программу, указанную в *args*, как имя команды, которое может отличаться от реально выполняемой программы. В POSIX имя *args* становится отображаемым именем исполняемого файла в утилитах вроде **ps**. Если `shell=True`, то в POSIX аргумент *executable* задаёт заменяющую оболочку вместо стандартной `/bin/sh`.265266*stdin*, *stdout* и *stderr* задают файловые дескрипторы стандартного ввода, стандартного вывода и стандартного вывода ошибок выполняемой программы соответственно. Допустимые значения: [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE), [`DEVNULL`](https://python-all.ru/3.4/library/subprocess.html#subprocess.DEVNULL), существующий файловый дескриптор (положительное целое число), существующий [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object) и `None`. [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE) означает, что должен быть создан новый канал к дочернему процессу. [`DEVNULL`](https://python-all.ru/3.4/library/subprocess.html#subprocess.DEVNULL) означает, что будет использоваться специальный файл [`os.devnull`](https://python-all.ru/3.4/library/os.html#os.devnull). При настройках по умолчанию `None` перенаправления не происходит; файловые дескрипторы дочернего процесса наследуются от родительского. Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr из приложений должны захватываться в тот же файловый дескриптор, что и stdout.267268Если *preexec\_fn* задан как вызываемый объект, этот объект будет вызван в дочернем процессе непосредственно перед его выполнением. (Только POSIX)269270> **Предупреждение**271>272> Параметр *preexec\_fn* небезопасно использовать при наличии потоков в приложении. Дочерний процесс может зависнуть до вызова exec. Если его всё же нужно использовать, пусть он будет тривиальным! Сведите к минимуму количество вызываемых библиотек.273274> **Примечание**275>276> Если нужно изменить окружение для дочернего процесса, используйте параметр *env* вместо изменения в *preexec\_fn*. Параметр *start\_new\_session* может заменить ранее распространённое использование *preexec\_fn* для вызова os.setsid() в дочернем процессе.277278Если *close\_fds* равно true, все файловые дескрипторы, кроме `0`, `1` и `2`, будут закрыты перед выполнением дочернего процесса (только POSIX). Значение по умолчанию зависит от платформы: на POSIX всегда true. На Windows оно равно true, когда *stdin*/*stdout*/*stderr* равны [`None`](https://python-all.ru/3.4/library/constants.html#None), и false в противном случае. На Windows, если *close\_fds* равно true, то дочерний процесс не наследует ни один дескриптор. Обратите внимание, что в Windows нельзя одновременно установить *close\_fds* в true и перенаправлять стандартные дескрипторы, задавая *stdin*, *stdout* или *stderr*.279280Изменено в версии 3.2: Значение по умолчанию для *close\_fds* было изменено с [`False`](https://python-all.ru/3.4/library/constants.html#False) на описанное выше.281282*pass\_fds* – это необязательная последовательность файловых дескрипторов, которые нужно оставить открытыми между родительским и дочерним процессами. Указание любого *pass\_fds* принудительно устанавливает *close\_fds* в [`True`](https://python-all.ru/3.4/library/constants.html#True) (только POSIX).283284Новое в версии 3.2: Добавлен параметр *pass\_fds*.285286Если *cwd* не равен `None`, функция меняет рабочий каталог на *cwd* перед выполнением дочернего процесса. В частности, функция ищет *executable* (или первый элемент в *args*) относительно *cwd*, если путь к исполняемому файлу является относительным.287288Если *restore\_signals* равен true (по умолчанию), все сигналы, которые Python установил в SIG\_IGN, восстанавливаются в SIG\_DFL в дочернем процессе перед exec. В настоящее время это включает сигналы SIGPIPE, SIGXFZ и SIGXFSZ. (Только POSIX)289290Изменено в версии 3.2: Добавлен *restore\_signals*.291292Если *start\_new\_session* равен true, системный вызов setsid() будет выполнен в дочернем процессе перед запуском подпроцесса. (только POSIX)293294Изменено в версии 3.2: добавлен *start\_new\_session*.295296Если *env* не равен `None`, он должен быть отображением, определяющим переменные окружения для нового процесса; они используются вместо поведения по умолчанию, заключающегося в наследовании окружения текущего процесса.297298> **Примечание**299>300> Если задан, то *env* должен предоставлять все переменные, необходимые для выполнения программы. В Windows, для запуска [side-by-side assembly](https://python-all.ru/3.4/library/subprocess.html), указанный *env* **обязан** включать корректный `SystemRoot`.301302Если *universal\_newlines* равен `True`, файловые объекты *stdin*, *stdout* и *stderr* открываются как текстовые потоки в режиме универсальных новых строк, как описано выше в разделе [*Часто используемые аргументы*](https://python-all.ru/3.4/library/subprocess.html#frequently-used-arguments); в противном случае они открываются как двоичные потоки.303304Если указан, *startupinfo* будет объектом [`STARTUPINFO`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO), который передаётся базовой функции `CreateProcess`. *creationflags*, если заданы, могут быть [`CREATE_NEW_CONSOLE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE) или [`CREATE_NEW_PROCESS_GROUP`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CREATE_NEW_PROCESS_GROUP) (только Windows).305306Объекты Popen поддерживаются в качестве контекстных менеджеров с помощью оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with): при выходе стандартные файловые дескрипторы закрываются, и выполняется ожидание завершения процесса.307308```python309with Popen(["ifconfig"], stdout=PIPE) as proc:310    log.write(proc.stdout.read())311```312313Изменено в версии 3.2: добавлена поддержка менеджера контекста.314315### 17.5.1.3. Исключения316317Исключения, возникшие в дочернем процессе до того, как новая программа начала выполнение, будут повторно возбуждены в родительском процессе. Кроме того, объект исключения будет иметь дополнительный атрибут с именем `child_traceback`, представляющий собой строку, содержащую информацию о трассировке с точки зрения дочернего процесса.318319Наиболее часто возбуждаемым исключением является [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Оно возникает, например, при попытке выполнить несуществующий файл. Приложения должны быть готовы к исключениям [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).320321Исключение [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) будет возбуждено, если [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) вызван с недопустимыми аргументами.322323[`check_call()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.check_call) и [`check_output()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.check_output) возбудят [`CalledProcessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError), если вызванный процесс вернёт ненулевой код возврата.324325Все функции и методы, принимающие параметр *timeout*, такие как [`call()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.call) и [`Popen.communicate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.communicate), возбудят [`TimeoutExpired`](https://python-all.ru/3.4/library/subprocess.html#subprocess.TimeoutExpired), если время ожидания истечёт до выхода процесса.326327Все исключения, определённые в этом модуле, наследуются от [`SubprocessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.SubprocessError).328329> Новое в версии 3.3: Был добавлен базовый класс [`SubprocessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.SubprocessError).330331## 17.5.2. Рекомендации по безопасности332333В отличие от некоторых других функций popen, данная реализация никогда не вызывает системную оболочку неявно. Это означает, что все символы, включая метасимволы оболочки, можно безопасно передавать дочерним процессам. Если оболочка вызывается явно, через `shell=True`, то на приложении лежит ответственность за правильное экранирование всех пробельных символов и метасимволов, чтобы избежать уязвимостей [внедрения команд оболочки](https://python-all.ru/3.4/library/subprocess.html).334335При использовании `shell=True` функция [`shlex.quote()`](https://python-all.ru/3.4/library/shlex.html#shlex.quote) может применяться для правильного экранирования пробельных символов и метасимволов оболочки в строках, которые будут использоваться для построения команд оболочки.336337## 17.5.3. Объекты Popen338339Экземпляры класса [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) имеют следующие методы:340341#### `Popen.poll()`342343Проверяет, завершился ли дочерний процесс. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.returncode).344345#### `Popen.wait(timeout=None)`346347Ожидает завершения дочернего процесса. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.returncode).348349Если процесс не завершается по истечении *timeout* секунд, возбуждается исключение [`TimeoutExpired`](https://python-all.ru/3.4/library/subprocess.html#subprocess.TimeoutExpired). Это исключение можно безопасно перехватить и повторить ожидание.350351> **Примечание**352>353> Это приведёт к взаимоблокировке при использовании `stdout=PIPE` или `stderr=PIPE`, если дочерний процесс генерирует достаточно данных в канал, так что он блокируется в ожидании, пока буфер канала ОС не примет ещё данные. Используйте [`Popen.communicate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.communicate) при работе с каналами, чтобы избежать этого.354355> **Примечание**356>357> Функция реализована с помощью активного цикла (неблокирующий вызов и короткие паузы). Для асинхронного ожидания используйте модуль [`asyncio`](https://python-all.ru/3.4/library/asyncio.html#module-asyncio): см. [`asyncio.create_subprocess_exec`](https://python-all.ru/3.4/library/asyncio-subprocess.html#asyncio.create_subprocess_exec).358359Изменено в версии 3.3: добавлен *timeout*.360361Устарело с версии 3.4: Не используйте параметр *endtime*. Он был случайно открыт в версии 3.3, но остался недокументированным, так как предполагался приватным для внутреннего использования. Вместо него используйте *timeout*.362363#### `Popen.communicate(input=None, timeout=None)`364365Взаимодействует с процессом: отправляет данные в stdin. Читает данные из stdout и stderr до достижения конца файла. Ожидает завершения процесса. Необязательный аргумент *input* должен содержать данные для отправки дочернему процессу, или `None`, если данные отправлять не нужно. Тип *input* должен быть bytes или, если *universal\_newlines* был `True`, строкой.366367[`communicate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.communicate) возвращает кортеж `(stdout_data, stderr_data)`.368369Обратите внимание: для отправки данных в stdin процесса объект Popen должен быть создан с `stdin=PIPE`. Аналогично, чтобы получить в результирующем кортеже что-либо, кроме `None`, нужно также указать `stdout=PIPE` и/или `stderr=PIPE`.370371Если процесс не завершится через *timeout* секунд, будет возбуждено исключение [`TimeoutExpired`](https://python-all.ru/3.4/library/subprocess.html#subprocess.TimeoutExpired). Перехват этого исключения и повторный вызов communication не приведёт к потере вывода.372373Дочерний процесс не уничтожается по истечении тайм-аута, поэтому для корректной очистки хорошо написанное приложение должно уничтожить дочерний процесс и завершить обмен данными:374375```python376proc = subprocess.Popen(...)377try:378    outs, errs = proc.communicate(timeout=15)379except TimeoutExpired:380    proc.kill()381    outs, errs = proc.communicate()382```383384> **Примечание**385>386> Прочитанные данные буферизуются в памяти, поэтому не используйте этот метод, если размер данных велик или неограничен.387388Изменено в версии 3.3: добавлен *timeout*.389390#### `Popen.send_signal(signal)`391392Отправляет сигнал *signal* дочернему процессу.393394> **Примечание**395>396> В Windows SIGTERM – это псевдоним для [`terminate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.terminate). Сигналы CTRL\_C\_EVENT и CTRL\_BREAK\_EVENT можно отправлять процессам, запущенным с параметром *creationflags*, включающим *CREATE\_NEW\_PROCESS\_GROUP*.397398#### `Popen.terminate()`399400Останавливает дочерний процесс. В ОС POSIX метод отправляет дочернему процессу сигнал SIGTERM. В Windows для остановки дочернего процесса вызывается функция Win32 API `TerminateProcess()`.401402#### `Popen.kill()`403404Завершает дочерний процесс. В ОС POSIX функция отправляет дочернему процессу сигнал SIGKILL. В Windows [`kill()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.kill) – это псевдоним для [`terminate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.terminate).405406Также доступны следующие атрибуты:407408#### `Popen.args`409410Аргумент *args* в том виде, в котором он был передан [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen): последовательность аргументов программы или одна строка.411412Новое в версии 3.3.413414#### `Popen.stdin`415416Если аргумент *stdin* был равен [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE), этот атрибут содержит потоковый объект для записи, как возвращаемый функцией [`open()`](https://python-all.ru/3.4/library/functions.html#open). Если аргумент *universal\_newlines* был равен `True`, поток будет текстовым, иначе – байтовым. Если аргумент *stdin* не был равен [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.417418#### `Popen.stdout`419420Если аргумент *stdout* был равен [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE), этот атрибут содержит потоковый объект для чтения, как возвращаемый функцией [`open()`](https://python-all.ru/3.4/library/functions.html#open). Чтение из потока даёт вывод дочернего процесса. Если аргумент *universal\_newlines* был равен `True`, поток будет текстовым, иначе – байтовым. Если аргумент *stdout* не был равен [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.421422#### `Popen.stderr`423424Если аргумент *stderr* был равен [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE), этот атрибут содержит потоковый объект для чтения, как возвращаемый функцией [`open()`](https://python-all.ru/3.4/library/functions.html#open). Чтение из потока даёт вывод ошибок дочернего процесса. Если аргумент *universal\_newlines* был равен `True`, поток будет текстовым, иначе – байтовым. Если аргумент *stderr* не был равен [`PIPE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.PIPE), этот атрибут равен `None`.425426> **Предупреждение**427>428> Используйте [`communicate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.communicate) вместо [`.stdin.write`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.stdin), [`.stdout.read`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.stdout) или [`.stderr.read`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.stderr), чтобы избежать взаимоблокировок из-за переполнения любого из буферов других каналов ОС, что блокирует дочерний процесс.429430#### `Popen.pid`431432PID дочернего процесса.433434Обратите внимание: если установить аргумент *shell* в значение `True`, то это будет идентификатор процесса запущенной оболочки.435436#### `Popen.returncode`437438Код возврата дочернего процесса, устанавливаемый методами [`poll()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.poll) и [`wait()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.wait) (а косвенно и [`communicate()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.communicate)). Значение `None` указывает, что процесс ещё не завершён.439440Отрицательное значение `-N` означает, что дочерний процесс был завершён сигналом `N` (только POSIX).441442## 17.5.4. Вспомогательные классы Popen для Windows443444Класс [`STARTUPINFO`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO) и следующие константы доступны только в Windows.445446#### `class subprocess.STARTUPINFO`447448Частичная поддержка структуры Windows [STARTUPINFO](https://python-all.ru/3.4/library/subprocess.html) используется при создании [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen).449450#### `dwFlags`451452Битовое поле, определяющее, используются ли некоторые атрибуты структуры [`STARTUPINFO`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO) при создании окна процесса.453454```python455si = subprocess.STARTUPINFO()456si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW457```458459#### `hStdInput`460461Если в [`dwFlags`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указан флаг [`STARTF_USESTDHANDLES`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного ввода процесса. Если [`STARTF_USESTDHANDLES`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTF_USESTDHANDLES) не указан, по умолчанию для стандартного ввода используется буфер клавиатуры.462463#### `hStdOutput`464465Если в [`dwFlags`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указан флаг [`STARTF_USESTDHANDLES`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного вывода процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартного вывода используется буфер окна консоли.466467#### `hStdError`468469If [`dwFlags`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) specifies [`STARTF_USESTDHANDLES`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), this attribute is the standard error handle for the process. Otherwise, this attribute is ignored and the default for standard error is the console window’s buffer.470471#### `wShowWindow`472473Если в [`dwFlags`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указан флаг [`STARTF_USESHOWWINDOW`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTF_USESHOWWINDOW), то этот атрибут может принимать любое из значений, допустимых для параметра `nCmdShow` функции [ShowWindow](https://python-all.ru/3.4/library/subprocess.html), за исключением `SW_SHOWDEFAULT`. В противном случае данный атрибут игнорируется.474475Для этого атрибута предусмотрено значение [`SW_HIDE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.SW_HIDE). Оно используется, когда [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) вызывается с параметром `shell=True`.476477### 17.5.4.1. Константы478479Модуль [`подпроцесс`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess) предоставляет следующие константы.480481#### `subprocess.STD_INPUT_HANDLE`482483Устройство стандартного ввода. Изначально это буфер ввода консоли, `CONIN$`.484485#### `subprocess.STD_OUTPUT_HANDLE`486487Устройство стандартного вывода. Изначально это активный экранный буфер консоли, `CONOUT$`.488489#### `subprocess.STD_ERROR_HANDLE`490491Устройство стандартного вывода ошибок. Изначально это активный экранный буфер консоли, `CONOUT$`.492493#### `subprocess.SW_HIDE`494495Скрывает окно. Другое окно будет активировано.496497#### `subprocess.STARTF_USESTDHANDLES`498499Указывает, что атрибуты [`STARTUPINFO.hStdInput`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO.hStdInput), [`STARTUPINFO.hStdOutput`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO.hStdOutput) и [`STARTUPINFO.hStdError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO.hStdError) содержат дополнительную информацию.500501#### `subprocess.STARTF_USESHOWWINDOW`502503Указывает, что атрибут [`STARTUPINFO.wShowWindow`](https://python-all.ru/3.4/library/subprocess.html#subprocess.STARTUPINFO.wShowWindow) содержит дополнительную информацию.504505#### `subprocess.CREATE_NEW_CONSOLE`506507Новый процесс получает новую консоль вместо наследования консоли родителя (по умолчанию).508509#### `subprocess.CREATE_NEW_PROCESS_GROUP`510511Параметр `creationflags` функции [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen), указывающий, что будет создана новая группа процессов. Этот флаг необходим для использования [`os.kill()`](https://python-all.ru/3.4/library/os.html#os.kill) для подпроцесса.512513Этот флаг игнорируется, если указан [`CREATE_NEW_CONSOLE`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE).514515## 17.5.5. Замена старых функций модулем [`подпроцесс`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess)516517В этом разделе «a становится b» означает, что b можно использовать как замену для a.518519> **Примечание**520>521> Все функции «a» в этом разделе при ненахождении исполняемой программы выдают ошибку (более или менее) молча; замены «b» вместо этого возбуждают исключение [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).522>523> Кроме того, замены с использованием [`check_output()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.check_output) завершатся ошибкой с исключением [`CalledProcessError`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError), если запрошенная операция вернёт ненулевой код возврата. Вывод по-прежнему доступен как атрибут [`output`](https://python-all.ru/3.4/library/subprocess.html#subprocess.CalledProcessError.output) возбуждённого исключения.524525В следующих примерах предполагается, что соответствующие функции уже импортированы из модуля [`подпроцесс`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess).526527### 17.5.5.1. Замена обратных кавычек оболочки /bin/sh528529```python530output=`mycmd myarg`531# becomes532output = check_output(["mycmd", "myarg"])533```534535### 17.5.5.2. Замена конвейера оболочки536537```python538output=`dmesg | grep hda`539# becomes540p1 = Popen(["dmesg"], stdout=PIPE)541p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)542p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.543output = p2.communicate()[0]544```545546Вызов p1.stdout.close() после запуска p2 важен для того, чтобы p1 получил SIGPIPE, если p2 завершится раньше p1.547548В качестве альтернативы, для доверенного ввода можно по-прежнему напрямую использовать встроенную поддержку конвейеров оболочки:549550```python551output=`dmesg | grep hda`552# becomes553output=check_output("dmesg | grep hda", shell=True)554```555556### 17.5.5.3. Замена [`os.system()`](https://python-all.ru/3.4/library/os.html#os.system)557558```python559sts = os.system("mycmd" + " myarg")560# становится561sts = call("mycmd" + " myarg", shell=True)562```563564Примечания:565566- Вызов программы через оболочку обычно не требуется.567568Более реалистичный пример выглядит так:569570```python571try:572    retcode = call("mycmd" + " myarg", shell=True)573    if retcode < 0:574        print("Child was terminated by signal", -retcode, file=sys.stderr)575    else:576        print("Child returned", retcode, file=sys.stderr)577except OSError as e:578    print("Execution failed:", e, file=sys.stderr)579```580581### 17.5.5.4. Замена семейства [`os.spawn`](https://python-all.ru/3.4/library/os.html#os.spawnl)582583Пример P\_NOWAIT:584585```python586pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")587==>588pid = Popen(["/bin/mycmd", "myarg"]).pid589```590591Пример P\_WAIT:592593```python594retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")595==>596retcode = call(["/bin/mycmd", "myarg"])597```598599Пример с вектором:600601```python602os.spawnvp(os.P_NOWAIT, path, args)603==>604Popen([path] + args[1:])605```606607Пример с окружением:608609```python610os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)611==>612Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})613```614615### 17.5.5.5. Замена [`os.popen()`](https://python-all.ru/3.4/library/os.html#os.popen), `os.popen2()`, `os.popen3()`616617```python618(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)619==>620p = Popen(cmd, shell=True, bufsize=bufsize,621          stdin=PIPE, stdout=PIPE, close_fds=True)622(child_stdin, child_stdout) = (p.stdin, p.stdout)623```624625```python626(child_stdin,627 child_stdout,628 child_stderr) = os.popen3(cmd, mode, bufsize)629==>630p = Popen(cmd, shell=True, bufsize=bufsize,631          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)632(child_stdin,633 child_stdout,634 child_stderr) = (p.stdin, p.stdout, p.stderr)635```636637```python638(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)639==>640p = Popen(cmd, shell=True, bufsize=bufsize,641          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)642(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)643```644645Обработка кода возврата выполняется следующим образом:646647```python648pipe = os.popen(cmd, 'w')649...650rc = pipe.close()651if rc is not None and rc >> 8:652    print("There were some errors")653==>654process = Popen(cmd, stdin=PIPE)655...656process.stdin.close()657if process.wait() != 0:658    print("There were some errors")659```660661### 17.5.5.6. Замена функций из модуля `popen2`662663> **Примечание**664>665> Если аргумент cmd функций popen2 является строкой, команда выполняется через /bin/sh. Если это список, команда выполняется напрямую.666667```python668(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)669==>670p = Popen("somestring", shell=True, bufsize=bufsize,671          stdin=PIPE, stdout=PIPE, close_fds=True)672(child_stdout, child_stdin) = (p.stdout, p.stdin)673```674675```python676(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)677==>678p = Popen(["mycmd", "myarg"], bufsize=bufsize,679          stdin=PIPE, stdout=PIPE, close_fds=True)680(child_stdout, child_stdin) = (p.stdout, p.stdin)681```682683`popen2.Popen3` и `popen2.Popen4` в основном работают как [`subprocess.Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen), за исключением того, что:684685- [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen) возбуждает исключение, если выполнение завершается неудачей.686- аргумент *capturestderr* заменён аргументом *stderr*.687- Необходимо указать `stdin=PIPE` и `stdout=PIPE`.688- popen2 по умолчанию закрывает все файловые дескрипторы, но для гарантии такого поведения на всех платформах или в старых версиях Python необходимо указать `close_fds=True` вместе с [`Popen`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen).689690## 17.5.6. Устаревшие функции вызова оболочки691692Этот модуль также предоставляет следующие устаревшие функции из модуля `commands` версии 2.x. Эти операции неявно вызывают системную оболочку, и ни одно из описанных выше гарантий безопасности и согласованности обработки исключений для этих функций не действует.693694#### `subprocess.getstatusoutput(cmd)`695696Возвращает `(status, output)` выполнения *cmd* в оболочке.697698Выполняет строку *cmd* в оболочке с помощью `Popen.check_output()` и возвращает кортеж из двух элементов `(status, output)`. Используется универсальный режим перевода строк; подробнее см. примечания к [*Часто используемые аргументы*](https://python-all.ru/3.4/library/subprocess.html#frequently-used-arguments).699700Завершающий символ новой строки удаляется из вывода. Код возврата команды можно интерпретировать по правилам для C-функции `wait()`. Пример:701702```python703>>> subprocess.getstatusoutput('ls /bin/ls')704(0, '/bin/ls')705>>> subprocess.getstatusoutput('cat /bin/junk')706(256, 'cat: /bin/junk: No such file or directory')707>>> subprocess.getstatusoutput('/bin/junk')708(256, 'sh: /bin/junk: not found')709```710711Доступность: POSIX и Windows712713Изменено в версии 3.3.4: Добавлена поддержка Windows714715#### `subprocess.getoutput(cmd)`716717Возвращает вывод (stdout и stderr) выполнения *cmd* в оболочке.718719Аналогично [`getstatusoutput()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.getstatusoutput), за исключением того, что код возврата игнорируется, а возвращаемое значение – строка, содержащая вывод команды. Пример:720721```python722>>> subprocess.getoutput('ls /bin/ls')723'/bin/ls'724```725726Доступность: POSIX и Windows727728Изменено в версии 3.3.4: Добавлена поддержка Windows729730## 17.5.7. Примечания731732### 17.5.7.1. Преобразование последовательности аргументов в строку в Windows733734В Windows последовательность *args* преобразуется в строку, которая может быть разобрана с помощью следующих правил (которые соответствуют правилам, используемым в MS C runtime):7357361. Аргументы разделяются пробельными символами, то есть пробелом или табуляцией.7372. Строка, заключённая в двойные кавычки, интерпретируется как один аргумент, независимо от пробельных символов внутри неё. Строка в кавычках может быть встроена в аргумент.7383. Двойная кавычка, перед которой стоит обратная косая черта, интерпретируется как литеральная двойная кавычка.7394. Обратные косые черты интерпретируются буквально, если только они не стоят непосредственно перед двойной кавычкой.7405. Если обратные косые черты стоят непосредственно перед двойной кавычкой, каждая пара обратных косых черт интерпретируется как литеральная обратная косая черта. Если количество обратных косых черт нечётное, последняя обратная косая черта экранирует следующую за ней двойную кавычку, как описано в правиле 3.741742> **См. также**743>744> **[`shlex`](https://python-all.ru/3.4/library/shlex.html#module-shlex)**745>746> Модуль, предоставляющий функцию для разбора и экранирования командных строк.747