subprocess.md
1> **Источник:** https://python-all.ru/2.7/library/subprocess.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 17.1. [`subprocess`](https://python-all.ru/2.7/library/subprocess.html#module-subprocess) – Управление подпроцессами89Новое в версии 2.4.1011Модуль [`subprocess`](https://python-all.ru/2.7/library/subprocess.html#module-subprocess) позволяет создавать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать их коды возврата. Этот модуль призван заменить несколько более старых модулей и функций:1213```python14os.system15os.spawn*16os.popen*17popen2.*18commands.*19```2021Информацию о том, как использовать этот модуль для замены старых функций, можно найти в разделе [subprocess-replacements](https://python-all.ru/2.7/library/subprocess.html#subprocess-replacements).2223> **См. также**24>25> Пользователям POSIX (Linux, BSD и т.д.) настоятельно рекомендуется установить и использовать гораздо более новый модуль [subprocess32](https://python-all.ru/2.7/library/subprocess.html) вместо версии, входящей в состав Python 2.7. Это прямая замена, которая во многих ситуациях ведёт себя лучше.26>27> [**PEP 324**](https://python-all.ru/2.7/library/subprocess.html) – PEP, предлагающий модуль подпроцесса2829## 17.1.1. Использование модуля [`subprocess`](https://python-all.ru/2.7/library/subprocess.html#module-subprocess)3031Рекомендуемый способ запуска подпроцессов – использовать следующие удобные функции. Для более сложных сценариев, когда их возможностей недостаточно, используйте базовый интерфейс [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen).3233#### `subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)`3435Запускает команду, описанную параметром *args*. Ожидает завершения команды и затем возвращает атрибут `returncode`.3637Приведённые выше аргументы – лишь самые распространённые, описанные ниже в разделе [Часто используемые аргументы](https://python-all.ru/2.7/library/subprocess.html#frequently-used-arguments) (отсюда несколько необычная запись в сокращённой сигнатуре). Полная сигнатура функции совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) – эта функция передаёт все указанные аргументы напрямую этому интерфейсу.3839Примеры:4041```python42>>> subprocess.call(["ls", "-l"])4304445>>> subprocess.call("exit 1", shell=True)46147```4849> **Предупреждение**50>51> Использование `shell=True` может быть опасным с точки зрения безопасности. Подробнее см. предупреждение в разделе [Часто используемые аргументы](https://python-all.ru/2.7/library/subprocess.html#frequently-used-arguments).5253> **Примечание**54>55> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией, так как это может привести к взаимоблокировке из-за большого объёма вывода дочернего процесса. Используйте [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) с методом `communicate()`, когда нужны каналы.5657#### `subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)`5859Выполняет команду с аргументами. Ожидает завершения команды. Если код возврата равен нулю, возвращает результат, иначе вызывает [`CalledProcessError`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError). Объект [`CalledProcessError`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError) будет содержать код возврата в атрибуте [`returncode`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError.returncode).6061Приведённые выше аргументы – лишь самые распространённые, описанные ниже в разделе [Часто используемые аргументы](https://python-all.ru/2.7/library/subprocess.html#frequently-used-arguments) (отсюда несколько необычная запись в сокращённой сигнатуре). Полная сигнатура функции совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) – эта функция передаёт все указанные аргументы напрямую этому интерфейсу.6263Примеры:6465```python66>>> subprocess.check_call(["ls", "-l"])6706869>>> subprocess.check_call("exit 1", shell=True)70Traceback (most recent call last):71 ...72subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 173```7475Новое в версии 2.5.7677> **Предупреждение**78>79> Использование `shell=True` может быть опасным с точки зрения безопасности. Подробнее см. предупреждение в разделе [Часто используемые аргументы](https://python-all.ru/2.7/library/subprocess.html#frequently-used-arguments).8081> **Примечание**82>83> Не используйте `stdout=PIPE` или `stderr=PIPE` с этой функцией, так как это может привести к взаимоблокировке из-за большого объёма вывода дочернего процесса. Используйте [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) с методом `communicate()`, когда нужны каналы.8485#### `subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)`8687Выполняет команду с аргументами и возвращает её вывод в виде байтовой строки.8889Если код возврата был ненулевым, возбуждается исключение [`CalledProcessError`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError). Объект [`CalledProcessError`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError) будет содержать код возврата в атрибуте [`returncode`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError.returncode), а вывод – в атрибуте [`output`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError.output).9091Приведённые выше аргументы – лишь самые распространённые, описанные ниже в разделе [Часто используемые аргументы](https://python-all.ru/2.7/library/subprocess.html#frequently-used-arguments) (отсюда несколько необычная запись в сокращённой сигнатуре). Полная сигнатура функции в основном совпадает с сигнатурой конструктора [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen), за исключением того, что *stdout* не допускается, так как используется внутри. Все остальные переданные аргументы передаются напрямую конструктору [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen).9293Примеры:9495```python96>>> subprocess.check_output(["echo", "Hello World!"])97'Hello World!\n'9899>>> subprocess.check_output("exit 1", shell=True)100Traceback (most recent call last):101 ...102subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1103```104105Чтобы также захватывать стандартный поток ошибок в результате, используйте `stderr=subprocess.STDOUT`:106107```python108>>> subprocess.check_output(109... "ls non_existent_file; exit 0",110... stderr=subprocess.STDOUT,111... shell=True)112'ls: non_existent_file: No such file or directory\n'113```114115Новое в версии 2.7.116117> **Предупреждение**118>119> Использование `shell=True` может быть опасным с точки зрения безопасности. Подробнее см. предупреждение в разделе [Часто используемые аргументы](https://python-all.ru/2.7/library/subprocess.html#frequently-used-arguments).120121> **Примечание**122>123> Не используйте `stderr=PIPE` с этой функцией, так как это может привести к взаимоблокировке из-за большого объёма ошибок дочернего процесса. Используйте [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) с методом `communicate()`, когда нужен канал для stderr.124125#### `subprocess.PIPE`126127Специальное значение, которое можно использовать в качестве аргумента *stdin*, *stdout* или *stderr* для [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) и которое указывает, что должен быть открыт канал к стандартному потоку.128129#### `subprocess.STDOUT`130131Специальное значение, которое можно использовать в качестве аргумента *stderr* для [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) и указывает, что стандартный поток ошибок должен направляться в тот же дескриптор, что и стандартный вывод.132133#### `exception subprocess.CalledProcessError`134135Исключение, возникающее, когда процесс, запущенный с помощью [`check_call()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.check_call) или [`check_output()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.check_output), возвращает ненулевой код завершения.136137#### `returncode`138139Код возврата дочернего процесса.140141#### `cmd`142143Команда, которая использовалась для запуска дочернего процесса.144145#### `output`146147Вывод дочернего процесса, если это исключение вызвано [`check_output()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.check_output). В противном случае – `None`.148149### 17.1.1.1. Часто используемые аргументы150151Чтобы поддерживать широкий спектр сценариев использования, конструктор [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) (и удобные функции) принимает большое количество необязательных аргументов. Для большинства типичных случаев многие из этих аргументов можно безопасно оставить со значениями по умолчанию. Наиболее часто требуемые аргументы:152153> *args* обязателен для всех вызовов и должен быть строкой или последовательностью аргументов программы. Как правило, предпочтительнее передавать последовательность аргументов, так как это позволяет модулю позаботиться о любом необходимом экранировании и кавычках аргументов (например, для пробелов в именах файлов). Если передаётся одна строка, то либо *shell* должен быть [`True`](https://python-all.ru/2.7/library/constants.html#True) (см. ниже), либо строка должна просто указывать имя программы для запуска без указания каких-либо аргументов.154>155> *stdin*, *stdout* и *stderr* задают дескрипторы файлов стандартного ввода, стандартного вывода и стандартного вывода ошибок выполняемой программы соответственно. Допустимые значения: [`PIPE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.PIPE), существующий файловый дескриптор (положительное целое число), существующий файловый объект и `None`. [`PIPE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.PIPE) указывает, что должен быть создан новый канал к дочернему процессу. При настройках по умолчанию `None` перенаправление не происходит; дескрипторы файлов дочернего процесса наследуются от родительского. Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr от дочернего процесса должны захватываться в тот же дескриптор, что и stdout.156>157> Если *stdout* или *stderr* являются каналами, а *universal\_newlines* имеет значение `True`, то все концы строк будут преобразованы в `'\n'`, как описано для аргумента режима [universal newlines](https://python-all.ru/2.7/glossary.html#term-universal-newlines) `'U'` в [`open()`](https://python-all.ru/2.7/library/functions.html#open).158>159> Если *shell* равен `True`, указанная команда будет выполняться через оболочку. Это может быть полезно, если вы используете Python в основном из-за улучшенного управления потоком, которое он предлагает по сравнению с большинством системных оболочек, и при этом хотите удобного доступа к другим возможностям оболочки, таким как конвейеры, подстановка имен файлов, подстановка переменных окружения и раскрытие `~` в домашний каталог пользователя. Однако имейте в виду, что сам Python предлагает реализации многих функций, подобных оболочке (в частности, [`glob`](https://python-all.ru/2.7/library/glob.html#module-glob), [`fnmatch`](https://python-all.ru/2.7/library/fnmatch.html#module-fnmatch), [`os.walk()`](https://python-all.ru/2.7/library/os.html#os.walk), [`os.path.expandvars()`](https://python-all.ru/2.7/library/os.path.html#os.path.expandvars), [`os.path.expanduser()`](https://python-all.ru/2.7/library/os.path.html#os.path.expanduser) и [`shutil`](https://python-all.ru/2.7/library/shutil.html#module-shutil)).160>161> > **Предупреждение**162> >163> > Выполнение shell-команд, включающих непроверенные входные данные из ненадёжного источника, делает программу уязвимой для [shell-инъекций](https://python-all.ru/2.7/library/subprocess.html) – серьёзной уязвимости безопасности, которая может привести к выполнению произвольных команд. По этой причине использование `shell=True` **настоятельно не рекомендуется**, если командная строка формируется из внешних данных:164> >165> > ```python166> > >>> from subprocess import call167> > >>> filename = input("What file would you like to display?\n")168> > What file would you like to display?169> > non_existent; rm -rf / #170> > >>> call("cat " + filename, shell=True) # Ой-ой. Это плохо кончится...171> > ```172> >173> > `shell=False` отключает все функции, основанные на shell, но не подвержен этой уязвимости; см. примечание в документации конструктора [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) для полезных советов по настройке `shell=False`.174> >175> > При использовании `shell=True` для правильного экранирования пробелов и shell-метасимволов в строках, которые будут использоваться для построения shell-команд, можно применять [`pipes.quote()`](https://python-all.ru/2.7/library/pipes.html#pipes.quote).176177Эти опции, как и все остальные, подробно описаны в документации конструктора [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen).178179### 17.1.1.2. Конструктор Popen180181Создание и управление базовыми процессами в этом модуле осуществляется классом [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen). Он предоставляет большую гибкость, чтобы разработчики могли обрабатывать менее распространённые случаи, не охваченные удобными функциями.182183#### `class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)`184185Запускает дочернюю программу в новом процессе. В Unix класс использует поведение, подобное [`os.execvp()`](https://python-all.ru/2.7/library/os.html#os.execvp), для выполнения дочерней программы. В Windows класс использует функцию Windows `CreateProcess()`. Аргументы [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) описаны ниже.186187*args* должен быть последовательностью аргументов программы или отдельной строкой. По умолчанию, если *args* является последовательностью, исполняемая программа – это первый элемент в *args*. Если *args* – строка, интерпретация зависит от платформы и описана ниже. Дополнительные отличия от поведения по умолчанию см. в аргументах *shell* и *executable*. Если не указано иное, рекомендуется передавать *args* как последовательность.188189В Unix, если *args* является строкой, она интерпретируется как имя или путь к выполняемой программе. Однако это можно сделать только в том случае, если программе не передаются аргументы.190191> **Примечание**192>193> [`shlex.split()`](https://python-all.ru/2.7/library/shlex.html#shlex.split) может быть полезен при определении правильной токенизации для *args*, особенно в сложных случаях:194>195> ```python196> >>> import shlex, subprocess197> >>> command_line = raw_input()198> /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"199> >>> args = shlex.split(command_line)200> >>> print args201> ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]202> >>> p = subprocess.Popen(args) # Успешно!203> ```204>205> Обратите внимание, что опции (такие как *-input*) и аргументы (такие как *eggs.txt*), разделённые пробелами в оболочке, помещаются в отдельные элементы списка, в то время как аргументы, требующие кавычек или обратной косой черты в оболочке (например, имена файлов, содержащие пробелы, или команда *echo*, показанная выше), являются отдельными элементами списка.206207На Windows, если *args* – последовательность, она будет преобразована в строку способом, описанным в разделе [Преобразование последовательности аргументов в строку на Windows](https://python-all.ru/2.7/library/subprocess.html#converting-argument-sequence). Это связано с тем, что базовая функция `CreateProcess()` работает со строками.208209Аргумент *shell* (по умолчанию `False`) определяет, нужно ли использовать оболочку в качестве исполняемой программы. Если *shell* равен `True`, рекомендуется передавать *args* в виде строки, а не последовательности.210211В Unix с `shell=True` по умолчанию используется shell `/bin/sh`. Если *args* – строка, она задаёт команду для выполнения через shell. Это означает, что строка должна быть отформатирована точно так, как если бы она была введена в приглашении shell. Это включает, например, экранирование кавычками или обратным слешем имён файлов, содержащих пробелы. Если *args* – последовательность, первый элемент задаёт командную строку, а все остальные элементы рассматриваются как дополнительные аргументы для самого shell. То есть, [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) делает эквивалент следующего:212213```python214Popen(['/bin/sh', '-c', args[0], args[1], ...])215```216217На Windows с `shell=True` переменная окружения `COMSPEC` задаёт оболочку по умолчанию. Указывать `shell=True` в Windows нужно только тогда, когда команда, которую требуется выполнить, встроена в оболочку (например, **dir** или **copy**). Для запуска пакетного файла или консольного исполняемого файла `shell=True` не требуется.218219> **Предупреждение**220>221> Передача `shell=True` может быть опасна с точки зрения безопасности в сочетании с ненадёжными входными данными. Подробнее см. предупреждение в разделе [Часто используемые аргументы](https://python-all.ru/2.7/library/subprocess.html#frequently-used-arguments).222223*bufsize*, если задан, имеет тот же смысл, что и соответствующий аргумент встроенной функции open(): `0` – без буферизации, `1` – построчная буферизация, любое другое положительное значение означает использование буфера (примерно) такого размера. Отрицательное *bufsize* означает использование системного значения по умолчанию, что обычно означает полную буферизацию. Значение по умолчанию для *bufsize* – `0` (без буферизации).224225> **Примечание**226>227> Если возникают проблемы с производительностью, рекомендуется попробовать включить буферизацию, установив *bufsize* в -1 или достаточно большое положительное значение (например, 4096).228229Аргумент *executable* задаёт заменяющую программу для выполнения. Он требуется крайне редко. Если `shell=False`, то *executable* заменяет программу, заданную *args*. Однако исходный *args* по-прежнему передаётся программе. Большинство программ рассматривают программу, указанную в *args*, как имя команды, которое может отличаться от фактически выполняемой программы. В Unix имя *args* становится отображаемым именем исполняемого файла в таких утилитах, как **ps**. Если `shell=True`, то в Unix аргумент *executable* задаёт замену shell для стандартного `/bin/sh`.230231*stdin*, *stdout* и *stderr* задают дескрипторы файлов стандартного ввода, стандартного вывода и стандартного вывода ошибок выполняемой программы соответственно. Допустимые значения: [`PIPE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.PIPE), существующий файловый дескриптор (положительное целое число), существующий файловый объект и `None`. [`PIPE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.PIPE) указывает, что должен быть создан новый канал к дочернему процессу. При настройках по умолчанию `None` перенаправление не происходит; дескрипторы файлов дочернего процесса наследуются от родительского. Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr от дочернего процесса должны захватываться в тот же дескриптор, что и stdout.232233Если *preexec\_fn* задан как вызываемый объект, этот объект будет вызван в дочернем процессе непосредственно перед его выполнением. (Только Unix)234235Если *close\_fds* равен true, все файловые дескрипторы, кроме `0`, `1` и `2`, будут закрыты перед выполнением дочернего процесса. (Только Unix). Или, в Windows, если *close\_fds* равен true, то дочерний процесс не унаследует ни одного дескриптора. Обратите внимание: в Windows нельзя одновременно установить *close\_fds* в true и перенаправлять стандартные дескрипторы с помощью *stdin*, *stdout* или *stderr*.236237Если *cwd* не равен `None`, текущий каталог дочернего процесса будет изменён на *cwd* перед его выполнением. Обратите внимание, что этот каталог не учитывается при поиске исполняемого файла, поэтому нельзя задать путь к программе относительно *cwd*.238239Если *env* не равен `None`, он должен быть отображением (mapping), определяющим переменные окружения для нового процесса; они используются вместо наследования окружения текущего процесса, что является поведением по умолчанию.240241> **Примечание**242>243> Если указано, *env* должен содержать все переменные, необходимые для выполнения программы. В Windows для запуска [компоновки side-by-side](https://python-all.ru/2.7/library/subprocess.html) указанный *env* **обязан** включать корректные `SystemRoot`.244245Если *universal\_newlines* равен `True`, файловые объекты *stdout* и *stderr* открываются как текстовые файлы в режиме [универсальных новых строк](https://python-all.ru/2.7/glossary.html#term-universal-newlines). Строки могут завершаться любым из `'\n'` (соглашение Unix о конце строки), `'\r'` (соглашение старого Macintosh) или `'\r\n'` (соглашение Windows). Все эти внешние представления интерпретируются программой Python как `'\n'`.246247> **Примечание**248>249> Эта функция доступна, только если Python собран с поддержкой универсальных новых строк (по умолчанию). Кроме того, атрибут newlines файловых объектов [`stdout`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.stdout), [`stdin`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.stdin) и [`stderr`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.stderr) не обновляется методом communicate().250251Если задан, *startupinfo* будет объектом [`STARTUPINFO`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO), который передаётся нижележащей функции `CreateProcess`. *creationflags*, если задан, может быть [`CREATE_NEW_CONSOLE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE) или [`CREATE_NEW_PROCESS_GROUP`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CREATE_NEW_PROCESS_GROUP) (только Windows).252253### 17.1.1.3. Исключения254255Исключения, возникающие в дочернем процессе до начала выполнения новой программы, будут повторно возбуждены в родительском процессе. Кроме того, объект исключения будет иметь дополнительный атрибут с именем `child_traceback`, который представляет собой строку, содержащую информацию о трассировке с точки зрения дочернего процесса.256257Наиболее часто вызываемое исключение – [`OSError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OSError). Оно возникает, например, при попытке выполнить несуществующий файл. Приложения должны быть готовы к исключениям [`OSError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OSError).258259[`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) будет вызван, если [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) вызвана с недопустимыми аргументами.260261[`check_call()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.check_call) и [`check_output()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.check_output) вызовут [`CalledProcessError`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError), если вызванный процесс вернёт ненулевой код возврата.262263### 17.1.1.4. Безопасность264265В отличие от некоторых других функций popen, данная реализация никогда не вызывает системную оболочку неявно. Это означает, что все символы, включая метасимволы оболочки, можно безопасно передавать дочерним процессам. Очевидно, если оболочка вызывается явно, то приложение отвечает за то, чтобы все пробелы и метасимволы были правильно экранированы.266267## 17.1.2. Объекты Popen268269Экземпляры класса [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) имеют следующие методы:270271#### `Popen.poll()`272273Проверяет, завершён ли дочерний процесс. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.returncode).274275#### `Popen.wait()`276277Ожидает завершения дочернего процесса. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.returncode).278279> **Предупреждение**280>281> Это приведёт к взаимной блокировке при использовании `stdout=PIPE` и/или `stderr=PIPE`, если дочерний процесс генерирует достаточно выходных данных для канала, так что он блокируется в ожидании, пока буфер канала ОС примет больше данных. Чтобы избежать этого, используйте [`communicate()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.communicate).282283#### `Popen.communicate(input=None)`284285Взаимодействие с процессом: отправка данных в stdin. Чтение данных из stdout и stderr до достижения конца файла. Ожидание завершения процесса. Необязательный аргумент *input* должен быть строкой, отправляемой дочернему процессу, или `None`, если данные не нужно отправлять.286287[`communicate()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.communicate) возвращает кортеж `(stdoutdata, stderrdata)`.288289Обратите внимание: если вы хотите отправить данные в stdin процесса, необходимо создать объект Popen с `stdin=PIPE`. Аналогично, чтобы получить что-то, кроме `None`, в результирующем кортеже, нужно также передать `stdout=PIPE` и/или `stderr=PIPE`.290291> **Примечание**292>293> Прочитанные данные буферизуются в памяти, поэтому не используйте этот метод, если размер данных велик или неограничен.294295#### `Popen.send_signal(signal)`296297Отправляет сигнал *signal* дочернему процессу.298299> **Примечание**300>301> В Windows SIGTERM является псевдонимом для [`terminate()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.terminate). CTRL\_C\_EVENT и CTRL\_BREAK\_EVENT можно отправлять процессам, запущенным с параметром *creationflags*, включающим *CREATE\_NEW\_PROCESS\_GROUP*.302303Новое в версии 2.6.304305#### `Popen.terminate()`306307Останавливает дочерний процесс. В ОС POSIX метод отправляет SIGTERM дочернему процессу. В Windows для остановки дочернего процесса вызывается функция Win32 API `TerminateProcess()`.308309Новое в версии 2.6.310311#### `Popen.kill()`312313Завершает дочерний процесс. В ОС POSIX функция отправляет SIGKILL дочернему процессу. В Windows [`kill()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.kill) является псевдонимом для [`terminate()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.terminate).314315Новое в версии 2.6.316317Также доступны следующие атрибуты:318319> **Предупреждение**320>321> Используйте [`communicate()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.communicate) вместо [`.stdin.write`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.stdin), [`.stdout.read`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.stdout) или [`.stderr.read`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.stderr), чтобы избежать взаимоблокировок из-за переполнения буферов каналов ОС и блокировки дочернего процесса.322323#### `Popen.stdin`324325Если аргумент *stdin* был равен [`PIPE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.PIPE), этот атрибут является файловым объектом, который предоставляет ввод дочернему процессу. В противном случае он равен `None`.326327#### `Popen.stdout`328329Если аргумент *stdout* был равен [`PIPE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.PIPE), этот атрибут является файловым объектом, который предоставляет вывод дочернего процесса. В противном случае он равен `None`.330331#### `Popen.stderr`332333Если аргумент *stderr* был равен [`PIPE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.PIPE), этот атрибут является файловым объектом, который предоставляет вывод ошибок дочернего процесса. В противном случае он равен `None`.334335#### `Popen.pid`336337PID дочернего процесса.338339Обратите внимание: если аргумент *shell* установлен в `True`, это PID запущенной оболочки.340341#### `Popen.returncode`342343Код возврата дочернего процесса, устанавливаемый методами [`poll()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.poll) и [`wait()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.wait) (а косвенно – [`communicate()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen.communicate)). Значение `None` указывает, что процесс ещё не завершён.344345Отрицательное значение `-N` указывает, что дочерний процесс был завершён сигналом\\n`N` (только Unix).346347## 17.1.3. Вспомогательные функции Popen для Windows348349Класс [`STARTUPINFO`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO) и следующие константы доступны только в Windows.350351#### `class subprocess.STARTUPINFO`352353Частичная поддержка структуры Windows [STARTUPINFO](https://python-all.ru/2.7/library/subprocess.html) используется для создания [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen).354355#### `dwFlags`356357Битовое поле, определяющее, используются ли определённые атрибуты [`STARTUPINFO`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO) при создании окна процессом.358359```python360si = subprocess.STARTUPINFO()361si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW362```363364#### `hStdInput`365366Если [`dwFlags`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного ввода процесса. Если [`STARTF_USESTDHANDLES`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTF_USESTDHANDLES) не указан, по умолчанию для стандартного ввода используется буфер клавиатуры.367368#### `hStdOutput`369370Если [`dwFlags`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного вывода процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартного вывода используется буфер окна консоли.371372#### `hStdError`373374Если [`dwFlags`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESTDHANDLES`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTF_USESTDHANDLES), этот атрибут является дескриптором стандартного вывода ошибок процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартного вывода ошибок используется буфер окна консоли.375376#### `wShowWindow`377378Если в [`dwFlags`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указан [`STARTF_USESHOWWINDOW`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTF_USESHOWWINDOW), этот атрибут может принимать любое значение, которое можно указать в параметре `nCmdShow` для функции [ShowWindow](https://python-all.ru/2.7/library/subprocess.html), за исключением `SW_SHOWDEFAULT`. В противном случае этот атрибут игнорируется.379380Для этого атрибута предоставляется [`SW_HIDE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.SW_HIDE). Он используется, когда [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) вызывается с `shell=True`.381382### 17.1.3.1. Константы383384Модуль [`subprocess`](https://python-all.ru/2.7/library/subprocess.html#module-subprocess) предоставляет следующие константы.385386#### `subprocess.STD_INPUT_HANDLE`387388Устройство стандартного ввода. Изначально это буфер консольного ввода, `CONIN$`.389390#### `subprocess.STD_OUTPUT_HANDLE`391392Устройство стандартного вывода. Изначально это активный буфер консольного экрана, `CONOUT$`.393394#### `subprocess.STD_ERROR_HANDLE`395396Устройство стандартного вывода ошибок. Изначально это активный буфер консольного экрана, `CONOUT$`.397398#### `subprocess.SW_HIDE`399400Скрывает окно. Другое окно будет активировано.401402#### `subprocess.STARTF_USESTDHANDLES`403404Указывает, что атрибуты [`STARTUPINFO.hStdInput`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO.hStdInput), [`STARTUPINFO.hStdOutput`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO.hStdOutput) и [`STARTUPINFO.hStdError`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO.hStdError) содержат дополнительную информацию.405406#### `subprocess.STARTF_USESHOWWINDOW`407408Указывает, что атрибут [`STARTUPINFO.wShowWindow`](https://python-all.ru/2.7/library/subprocess.html#subprocess.STARTUPINFO.wShowWindow) содержит дополнительную информацию.409410#### `subprocess.CREATE_NEW_CONSOLE`411412Новый процесс получает новую консоль вместо наследования консоли родителя (по умолчанию).413414Этот флаг всегда устанавливается, когда [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) создаётся с помощью `shell=True`.415416#### `subprocess.CREATE_NEW_PROCESS_GROUP`417418Параметр [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) `creationflags`, указывающий, что будет создана новая группа процессов. Этот флаг необходим для использования [`os.kill()`](https://python-all.ru/2.7/library/os.html#os.kill) в подпроцессе.419420Этот флаг игнорируется, если указан [`CREATE_NEW_CONSOLE`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE).421422## 17.1.4. Замена старых функций на модуль [`subprocess`](https://python-all.ru/2.7/library/subprocess.html#module-subprocess)423424В этом разделе «a становится b» означает, что b можно использовать как замену для a.425426> **Примечание**427>428> Все функции вида «a» в этом разделе завершаются ошибкой (более или менее) молча, если выполняемая программа не найдена; замены «b» вместо этого возбуждают [`OSError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OSError).429>430> Кроме того, замены, использующие [`check_output()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.check_output), будут завершаться ошибкой с [`CalledProcessError`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError), если запрошенная операция возвращает ненулевой код возврата. Вывод по-прежнему доступен как атрибут [`output`](https://python-all.ru/2.7/library/subprocess.html#subprocess.CalledProcessError.output) возбуждённого исключения.431432В следующих примерах предполагается, что соответствующие функции уже импортированы из модуля [`subprocess`](https://python-all.ru/2.7/library/subprocess.html#module-subprocess).433434### 17.1.4.1. Замена обратных кавычек оболочки /bin/sh435436```bash437output=`mycmd myarg`438```439440становится:441442```python443output = check_output(["mycmd", "myarg"])444```445446### 17.1.4.2. Замена конвейера оболочки447448```bash449output=`dmesg | grep hda`450```451452становится:453454```python455p1 = Popen(["dmesg"], stdout=PIPE)456p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)457p1.stdout.close() # Разрешить p1 получать SIGPIPE, если p2 завершается.458output = p2.communicate()[0]459```460461Вызов p1.stdout.close() после запуска p2 важен для того, чтобы p1 получил SIGPIPE, если p2 завершится раньше p1.462463В качестве альтернативы, для доверенного ввода можно по-прежнему напрямую использовать встроенную поддержку конвейеров оболочки:464465```bash466output=`dmesg | grep hda`467```468469становится:470471```python472output=check_output("dmesg | grep hda", shell=True)473```474475### 17.1.4.3. Замена [`os.system()`](https://python-all.ru/2.7/library/os.html#os.system)476477```python478status = os.system("mycmd" + " myarg")479# становится480status = subprocess.call("mycmd" + " myarg", shell=True)481```482483Примечания:484485- Вызов программы через оболочку обычно не требуется.486487Более реалистичный пример выглядит так:488489```python490try:491 retcode = call("mycmd" + " myarg", shell=True)492 if retcode < 0:493 print >>sys.stderr, "Child was terminated by signal", -retcode494 else:495 print >>sys.stderr, "Child returned", retcode496except OSError as e:497 print >>sys.stderr, "Execution failed:", e498```499500### 17.1.4.4. Замена семейства [`os.spawn`](https://python-all.ru/2.7/library/os.html#os.spawnl)501502Пример P\_NOWAIT:503504```python505pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")506==>507pid = Popen(["/bin/mycmd", "myarg"]).pid508```509510Пример P\_WAIT:511512```python513retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")514==>515retcode = call(["/bin/mycmd", "myarg"])516```517518Пример с вектором:519520```python521os.spawnvp(os.P_NOWAIT, path, args)522==>523Popen([path] + args[1:])524```525526Пример с окружением:527528```python529os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)530==>531Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})532```533534### 17.1.4.5. Замена [`os.popen()`](https://python-all.ru/2.7/library/os.html#os.popen), [`os.popen2()`](https://python-all.ru/2.7/library/os.html#os.popen2), [`os.popen3()`](https://python-all.ru/2.7/library/os.html#os.popen3)535536```python537pipe = os.popen("cmd", 'r', bufsize)538==>539pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout540```541542```python543pipe = os.popen("cmd", 'w', bufsize)544==>545pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin546```547548```python549(child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize)550==>551p = Popen("cmd", shell=True, bufsize=bufsize,552 stdin=PIPE, stdout=PIPE, close_fds=True)553(child_stdin, child_stdout) = (p.stdin, p.stdout)554```555556```python557(child_stdin,558 child_stdout,559 child_stderr) = os.popen3("cmd", mode, bufsize)560==>561p = Popen("cmd", shell=True, bufsize=bufsize,562 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)563(child_stdin,564 child_stdout,565 child_stderr) = (p.stdin, p.stdout, p.stderr)566```567568```python569(child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode,570 bufsize)571==>572p = Popen("cmd", shell=True, bufsize=bufsize,573 stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)574(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)575```576577В Unix os.popen2, os.popen3 и os.popen4 также принимают последовательность в качестве команды для выполнения; в этом случае аргументы будут переданы непосредственно программе без участия оболочки. Это использование можно заменить следующим образом:578579```python580(child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode,581 bufsize)582==>583p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE)584(child_stdin, child_stdout) = (p.stdin, p.stdout)585```586587Обработка кода возврата выполняется следующим образом:588589```python590pipe = os.popen("cmd", 'w')591...592rc = pipe.close()593if rc is not None and rc >> 8:594 print "There were some errors"595==>596process = Popen("cmd", shell=True, stdin=PIPE)597...598process.stdin.close()599if process.wait() != 0:600 print "There were some errors"601```602603### 17.1.4.6. Замена функций из модуля [`popen2`](https://python-all.ru/2.7/library/popen2.html#module-popen2)604605```python606(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)607==>608p = Popen("somestring", shell=True, bufsize=bufsize,609 stdin=PIPE, stdout=PIPE, close_fds=True)610(child_stdout, child_stdin) = (p.stdout, p.stdin)611```612613В Unix popen2 также принимает последовательность в качестве команды для выполнения; в этом случае аргументы будут переданы непосредственно программе без участия оболочки. Это использование можно заменить следующим образом:614615```python616(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize,617 mode)618==>619p = Popen(["mycmd", "myarg"], bufsize=bufsize,620 stdin=PIPE, stdout=PIPE, close_fds=True)621(child_stdout, child_stdin) = (p.stdout, p.stdin)622```623624[`popen2.Popen3`](https://python-all.ru/2.7/library/popen2.html#popen2.Popen3) и [`popen2.Popen4`](https://python-all.ru/2.7/library/popen2.html#popen2.Popen4) в основном работают как [`subprocess.Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen), за исключением того, что:625626- [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen) вызывает исключение, если выполнение завершается неудачей.627- аргумент *capturestderr* заменён аргументом *stderr*.628- `stdin=PIPE` и `stdout=PIPE` должны быть указаны.629- popen2 по умолчанию закрывает все файловые дескрипторы, но необходимо указать `close_fds=True` вместе с [`Popen`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen).630631## 17.1.5. Примечания632633### 17.1.5.1. Преобразование последовательности аргументов в строку в Windows634635В Windows последовательность *args* преобразуется в строку, которая может быть разобрана с помощью следующих правил (которые соответствуют правилам, используемым в MS C runtime):6366371. Аргументы разделяются пробельными символами, то есть пробелом или табуляцией.6382. Строка, заключённая в двойные кавычки, интерпретируется как один аргумент, независимо от пробельных символов внутри неё. Строка в кавычках может быть встроена в аргумент.6393. Двойная кавычка, перед которой стоит обратная косая черта, интерпретируется как литеральная двойная кавычка.6404. Обратные косые черты интерпретируются буквально, если только они не стоят непосредственно перед двойной кавычкой.6415. Если обратные косые черты стоят непосредственно перед двойной кавычкой, каждая пара обратных косых черт интерпретируется как литеральная обратная косая черта. Если количество обратных косых черт нечётное, последняя обратная косая черта экранирует следующую за ней двойную кавычку, как описано в правиле 3.642