subprocess.md
1> **Источник:** https://python-all.ru/3.1/library/subprocess.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 17.1. `subprocess` – Управление подпроцессами89Модуль `subprocess` позволяет порождать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать коды возврата. Этот модуль предназначен для замены нескольких других, более старых модулей и функций, таких как:1011```python12os.system13os.spawn*14```1516Информация о том, как модуль `subprocess` может использоваться для замены этих модулей и функций, находится в следующих разделах.1718> **См. также**19>20> [**PEP 324**](https://python-all.ru/3.1/library/subprocess.html) – PEP, предлагающий модуль подпроцесса2122## 17.1.1. Использование модуля подпроцесс2324Этот модуль определяет один класс с именем [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen):2526#### `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)`2728Аргументы:2930*args* должен быть строкой или последовательностью аргументов программы. Выполняемая программа обычно является первым элементом последовательности args или самой строкой, если передана строка, но может быть явно задана с помощью аргумента *executable*. Когда указан *executable*, первый элемент последовательности args по-прежнему воспринимается большинством программ как имя команды, которое может отличаться от реального имени исполняемого файла. В Unix он становится отображаемым именем выполняемой программы в таких утилитах, как **ps**.3132В Unix с *shell=False* (по умолчанию): в этом случае класс Popen использует [`os.execvp()`](https://python-all.ru/3.1/library/os.html#os.execvp) для выполнения дочерней программы. *args* обычно должен быть последовательностью. Если для *args* указана строка, она будет использоваться как имя или путь к выполняемой программе; это сработает только если программе не передаются аргументы.3334> **Примечание**35>36> [`shlex.split()`](https://python-all.ru/3.1/library/shlex.html#shlex.split) может быть полезен при определении правильной токенизации *args*, особенно в сложных случаях:37>38> ```python39> >>> import shlex, subprocess40> >>> command_line = input()41> /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"42> >>> args = shlex.split(command_line)43> >>> print(args)44> ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]45> >>> p = subprocess.Popen(args) # Успешно!46> ```47>48> Обратите внимание, что опции (такие как *-input*) и аргументы (такие как *eggs.txt*), разделённые пробелами в оболочке, помещаются в отдельные элементы списка, в то время как аргументы, требующие кавычек или обратной косой черты в оболочке (например, имена файлов, содержащие пробелы, или команда *echo*, показанная выше), являются отдельными элементами списка.4950В Unix с *shell=True*: если args – строка, она задает командную строку для выполнения через оболочку. Это означает, что строка должна быть отформатирована точно так же, как если бы она вводилась в приглашении оболочки. Это включает, например, кавычки или экранирование обратной косой чертой имен файлов с пробелами. Если *args* – последовательность, первый элемент задает командную строку, а любые дополнительные элементы будут рассматриваться как дополнительные аргументы для самой оболочки. Иными словами, *Popen* делает эквивалент:5152```python53Popen(['/bin/sh', '-c', args[0], args[1], ...])54```5556> **Предупреждение**57>58> Выполнение команд оболочки, содержащих непроверенные входные данные из ненадёжного источника, делает программу уязвимой для [внедрения команд оболочки](https://python-all.ru/3.1/library/subprocess.html) – серьёзной уязвимости безопасности, которая может привести к выполнению произвольных команд. По этой причине использование *shell=True* **настоятельно не рекомендуется** в тех случаях, когда командная строка формируется из внешних данных:59>60> ```python61> >>> from subprocess import call62> >>> filename = input("What file would you like to display?\n")63> What file would you like to display?64> non_existent; rm -rf / #65> >>> call("cat " + filename, shell=True) # Ой-ой. Это плохо кончится...66> ```67>68> *shell=False* не подвержен этой уязвимости; приведённое выше примечание может помочь в настройке кода, использующего *shell=False*.6970В Windows: класс [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen) использует CreateProcess() для выполнения дочерней программы, которая работает со строками. Если *args* является последовательностью, она будет преобразована в строку способом, описанным в разделе [*Преобразование последовательности аргументов в строку в Windows*](https://python-all.ru/3.1/library/subprocess.html#converting-argument-sequence).7172*bufsize*, если задан, имеет тот же смысл, что и соответствующий аргумент встроенной функции open(): `0` – без буферизации, `1` – построчная буферизация, любое другое положительное значение означает использование буфера (примерно) такого размера. Отрицательное *bufsize* означает использование системного значения по умолчанию, что обычно означает полную буферизацию. Значение по умолчанию для *bufsize* – `0` (без буферизации).7374> **Примечание**75>76> Если возникают проблемы с производительностью, рекомендуется попробовать включить буферизацию, установив *bufsize* в -1 или достаточно большое положительное значение (например, 4096).7778Аргумент *executable* задаёт программу для выполнения. Он требуется очень редко: обычно выполняемая программа определяется аргументом *args*. Если `shell=True`, аргумент *executable* указывает, какую оболочку использовать. В Unix оболочкой по умолчанию является `/bin/sh`. В Windows оболочка по умолчанию задаётся переменной окружения **COMSPEC**. Единственная причина, по которой может потребоваться указать `shell=True` в Windows – это если команда, которую требуется выполнить, встроена в оболочку, например `dir`, `copy`. Для запуска пакетного файла или консольного исполняемого файла `shell=True` не требуется.7980*stdin*, *stdout* и *stderr* задают файловые дескрипторы стандартного ввода, стандартного вывода и стандартного вывода ошибок выполняемой программы соответственно. Допустимые значения: [`PIPE`](https://python-all.ru/3.1/library/subprocess.html#subprocess.PIPE), существующий файловый дескриптор (положительное целое число), существующий [*файловый объект*](https://python-all.ru/3.1/glossary.html#term-file-object) и `None`. [`PIPE`](https://python-all.ru/3.1/library/subprocess.html#subprocess.PIPE) означает, что должен быть создан новый канал к дочернему процессу. При `None` перенаправление не производится; файловые дескрипторы дочернего процесса наследуются от родительского. Кроме того, *stderr* может быть [`STDOUT`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STDOUT), что означает, что данные stderr от приложений должны захватываться в тот же файловый дескриптор, что и stdout.8182Если *preexec\_fn* задан как вызываемый объект, этот объект будет вызван в дочернем процессе непосредственно перед его выполнением. (Только Unix)8384Если *close\_fds* равен true, все файловые дескрипторы, кроме `0`, `1` и `2`, будут закрыты перед выполнением дочернего процесса. (Только Unix). Или, в Windows, если *close\_fds* равен true, то дочерний процесс не унаследует ни одного дескриптора. Обратите внимание: в Windows нельзя одновременно установить *close\_fds* в true и перенаправлять стандартные дескрипторы с помощью *stdin*, *stdout* или *stderr*.8586Если *shell* равен [`True`](https://python-all.ru/3.1/library/constants.html#True), указанная команда будет выполняться через оболочку.8788Если *cwd* не равен `None`, текущий каталог дочернего процесса будет изменён на *cwd* перед его выполнением. Обратите внимание, что этот каталог не учитывается при поиске исполняемого файла, поэтому нельзя указать путь к программе относительно *cwd*.8990Если *env* не равен `None`, он должен быть отображением, определяющим переменные окружения для нового процесса; они используются вместо наследования окружения текущего процесса, что является поведением по умолчанию.9192> **Примечание**93>94> Если задан, *env* должен предоставлять все переменные, необходимые для выполнения программы. В Windows для запуска [компонента side-by-side](https://python-all.ru/3.1/library/subprocess.html) указанный *env* **обязан** содержать допустимый **SystemRoot**.9596Если *universal\_newlines* равен [`True`](https://python-all.ru/3.1/library/constants.html#True), файловые объекты stdout и stderr открываются как текстовые файлы, но строки могут завершаться любым из символов: `'\n'` (соглашение Unix), `'\r'` (соглашение старых Macintosh) или `'\r\n'` (соглашение Windows). Все эти внешние представления воспринимаются программой Python как `'\n'`.9798> **Примечание**99>100> Эта возможность доступна только если Python собран с поддержкой универсальных символов новой строки (по умолчанию). Кроме того, атрибут newlines файловых объектов [`stdout`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.stdout), [`stdin`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.stdin) и [`stderr`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.stderr) не обновляется методом [`communicate()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.communicate).101102Если задан, *startupinfo* будет объектом [`STARTUPINFO`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO), который передаётся базовой функции `CreateProcess`. *creationflags*, если задан, может быть [`CREATE_NEW_CONSOLE`](https://python-all.ru/3.1/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE). (Только Windows)103104#### `subprocess.PIPE`105106Специальное значение, которое может использоваться в качестве аргумента107108*stdin*109110,111112*stdout*113114или115116*stderr*117118для119120[`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen)121122и указывает, что должен быть открыт канал к стандартному потоку.123124#### `subprocess.STDOUT`125126Специальное значение, которое может использоваться в качестве аргумента127128*stderr*129130для131132[`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen)133134и указывает, что стандартный поток ошибок должен направляться в тот же дескриптор, что и стандартный вывод.135136### 17.1.1.1. Вспомогательные функции137138Этот модуль также определяет следующие сокращённые функции:139140#### `subprocess.call(*popenargs, **kwargs)`141142Запускает команду с аргументами. Ожидает завершения команды, затем возвращает атрибут `returncode`.143144Аргументы такие же, как у конструктора Popen. Пример:145146```python147>>> retcode = subprocess.call(["ls", "-l"])148```149150> **Предупреждение**151>152> Как и [`Popen.wait()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.wait), этот метод приведет к взаимной блокировке, если дочерний процесс создаст достаточно выходных данных для каналов stdout или stderr, так что он заблокируется в ожидании, пока буфер канала ОС не сможет принять больше данных.153154#### `subprocess.check_call(*popenargs, **kwargs)`155156Запускает команду с аргументами. Ожидает завершения команды. Если код возврата равен нулю, то завершается, иначе возбуждает `CalledProcessError`. Объект `CalledProcessError` будет содержать код возврата в атрибуте `returncode`.157158Аргументы такие же, как у конструктора Popen. Пример:159160```python161>>> subprocess.check_call(["ls", "-l"])1620163```164165> **Предупреждение**166>167> См. предупреждение для [`call()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.call).168169#### `subprocess.check_output(*popenargs, **kwargs)`170171Выполняет команду с аргументами и возвращает её вывод в виде байтовой строки.172173Если код возврата ненулевой, возбуждается `CalledProcessError`. Объект `CalledProcessError` будет содержать код возврата в атрибуте `returncode` и вывод в атрибуте `output`.174175Аргументы такие же, как у конструктора [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen). Пример:176177```python178>>> subprocess.check_output(["ls", "-l", "/dev/null"])179b'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'180```181182Аргумент stdout не допускается, так как он используется внутренне. Чтобы захватить стандартную ошибку в результате, используйте `stderr=subprocess.STDOUT`:183184```python185>>> subprocess.check_output(186... ["/bin/sh", "-c", "ls non_existent_file; exit 0"],187... stderr=subprocess.STDOUT)188b'ls: non_existent_file: No such file or directory\n'189```190191Новое в версии 3.1.192193#### `subprocess.getstatusoutput(cmd)`194195Возвращает `(status, output)` выполнения *cmd* в оболочке.196197Выполняет строку *cmd* в оболочке с помощью `os.popen()` и возвращает кортеж из двух элементов `(status, output)`. Строка *cmd* на самом деле выполняется как `{ cmd ; } 2>&1`, поэтому возвращаемый вывод содержит сообщения стандартного вывода и ошибок. Завершающий символ новой строки удаляется из вывода. Код завершения команды можно интерпретировать согласно правилам для C-функции `wait()`. Пример:198199```python200>>> subprocess.getstatusoutput('ls /bin/ls')201(0, '/bin/ls')202>>> subprocess.getstatusoutput('cat /bin/junk')203(256, 'cat: /bin/junk: No such file or directory')204>>> subprocess.getstatusoutput('/bin/junk')205(256, 'sh: /bin/junk: not found')206```207208Доступность: UNIX.209210#### `subprocess.getoutput(cmd)`211212Возвращает вывод (stdout и stderr) выполнения *cmd* в оболочке.213214Аналогично [`getstatusoutput()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.getstatusoutput), за исключением того, что код возврата игнорируется, а возвращаемое значение – строка, содержащая вывод команды. Пример:215216```python217>>> subprocess.getoutput('ls /bin/ls')218'/bin/ls'219```220221Доступность: UNIX.222223### 17.1.1.2. Исключения224225Исключения, возникшие в дочернем процессе до того, как новая программа начала выполнение, будут повторно возбуждены в родительском процессе. Кроме того, объект исключения будет иметь дополнительный атрибут с именем `child_traceback`, представляющий собой строку, содержащую информацию о трассировке с точки зрения дочернего процесса.226227Наиболее часто возбуждаемым исключением является [`OSError`](https://python-all.ru/3.1/library/exceptions.html#OSError). Оно возникает, например, при попытке выполнить несуществующий файл. Приложения должны быть готовы к исключениям [`OSError`](https://python-all.ru/3.1/library/exceptions.html#OSError).228229Исключение [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError) будет возбуждено, если [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen) вызван с недопустимыми аргументами.230231check\_call() возбуждает `CalledProcessError`, если вызванный процесс возвращает ненулевой код возврата.232233### 17.1.1.3. Безопасность234235В отличие от некоторых других функций popen, данная реализация никогда не вызывает /bin/sh неявно. Это означает, что все символы, включая метасимволы оболочки, могут безопасно передаваться дочерним процессам.236237## 17.1.2. Объекты Popen238239Экземпляры класса [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen) имеют следующие методы:240241#### `Popen.poll()`242243Проверяет, завершён ли дочерний процесс. Устанавливает и возвращает атрибут244245[`returncode`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.returncode)246247.248249#### `Popen.wait()`250251Ожидает завершения дочернего процесса. Устанавливает и возвращает атрибут [`returncode`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.returncode).252253> **Предупреждение**254>255> Это приведет к взаимной блокировке, если дочерний процесс создаст достаточно выходных данных для канала stdout или stderr, так что он заблокируется в ожидании, пока буфер канала ОС не сможет принять больше данных. Используйте [`communicate()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.communicate), чтобы избежать этого.256257#### `Popen.communicate(input=None)`258259Взаимодействие с процессом: отправляет данные в stdin. Читает данные из stdout и stderr до достижения конца файла. Ожидает завершения процесса. Необязательный аргумент *input* должен быть байтовой строкой для отправки дочернему процессу, или `None`, если данные не должны отправляться.260261[`communicate()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.communicate) возвращает кортеж `(stdoutdata, stderrdata)`.262263Обратите внимание: для отправки данных в stdin процесса объект Popen должен быть создан с `stdin=PIPE`. Аналогично, чтобы получить в результирующем кортеже что-либо, кроме `None`, нужно также указать `stdout=PIPE` и/или `stderr=PIPE`.264265> **Примечание**266>267> Прочитанные данные буферизуются в памяти, поэтому не используйте этот метод, если размер данных велик или неограничен.268269#### `Popen.send_signal(signal)`270271Отправляет сигнал *signal* дочернему процессу.272273> **Примечание**274>275> В Windows на данный момент поддерживается только SIGTERM. Это псевдоним для [`terminate()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.terminate).276277#### `Popen.terminate()`278279Останавливает дочерний процесс. В ОС POSIX метод отправляет дочернему процессу сигнал SIGTERM. В Windows для остановки дочернего процесса вызывается функция Win32 API280281`TerminateProcess()`282283.284285#### `Popen.kill()`286287Завершает дочерний процесс. В ОС POSIX функция отправляет дочернему процессу сигнал SIGKILL. В Windows288289[`kill()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.kill)290291– это псевдоним для292293[`terminate()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.terminate)294295.296297Также доступны следующие атрибуты:298299> **Предупреждение**300>301> Используйте `communicate()`, а не `.stdin.write`, `.stdout.read` или `.stderr.read`, чтобы избежать взаимных блокировок из-за переполнения буферов каналов ОС и блокировки дочернего процесса.302303#### `Popen.stdin`304305Если аргумент306307*stdin*308309был равен310311[`PIPE`](https://python-all.ru/3.1/library/subprocess.html#subprocess.PIPE)312313, то этот атрибут представляет собой314315[*файловый объект*](https://python-all.ru/3.1/glossary.html#term-file-object)316317, который передаёт входные данные дочернему процессу. В противном случае он равен318319`None`320321.322323#### `Popen.stdout`324325Если аргумент326327*stdout*328329был равен330331[`PIPE`](https://python-all.ru/3.1/library/subprocess.html#subprocess.PIPE)332333, то этот атрибут представляет собой334335[*файловый объект*](https://python-all.ru/3.1/glossary.html#term-file-object)336337, который возвращает выходные данные дочернего процесса. В противном случае он равен338339`None`340341.342343#### `Popen.stderr`344345Если аргумент346347*stderr*348349был равен350351[`PIPE`](https://python-all.ru/3.1/library/subprocess.html#subprocess.PIPE)352353, то этот атрибут представляет собой354355[*файловый объект*](https://python-all.ru/3.1/glossary.html#term-file-object)356357, который возвращает сообщения об ошибках дочернего процесса. В противном случае он равен358359`None`360361.362363#### `Popen.pid`364365PID дочернего процесса.366367Обратите внимание: если установить аргумент *shell* в значение `True`, то это будет идентификатор процесса запущенной оболочки.368369#### `Popen.returncode`370371Код возврата дочернего процесса, устанавливаемый методами [`poll()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.poll) и [`wait()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.wait) (а косвенно и [`communicate()`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen.communicate)). Значение `None` указывает, что процесс ещё не завершён.372373Отрицательное значение `-N` означает, что дочерний процесс был завершён сигналом `N` (только в Unix).374375## 17.1.3. Вспомогательные средства Popen для Windows376377Класс [`STARTUPINFO`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO) и следующие константы доступны только в Windows.378379#### `class subprocess.STARTUPINFO`380381Частичная поддержка структуры Windows [STARTUPINFO](https://python-all.ru/3.1/library/subprocess.html) используется при создании [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen).382383#### `dwFlags`384385Битовое поле, определяющее, используются ли определённые члены [`STARTUPINFO`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO) при создании окна процессом.386387```python388si = subprocess.STARTUPINFO()389si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW390```391392#### `hStdInput`393394Если395396[`dwFlags`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO.dwFlags)397398указывает399400[`STARTF_USESTDHANDLES`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTF_USESTDHANDLES)401402, этот член является дескриптором стандартного ввода для процесса. Если403404[`STARTF_USESTDHANDLES`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTF_USESTDHANDLES)405406не указан, по умолчанию для стандартного ввода используется буфер клавиатуры.407408#### `hStdOutput`409410Если411412[`dwFlags`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO.dwFlags)413414указывает415416[`STARTF_USESTDHANDLES`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTF_USESTDHANDLES)417418, этот член является дескриптором стандартного вывода для процесса. В противном случае этот член игнорируется, и по умолчанию для стандартного вывода используется буфер окна консоли.419420#### `hStdError`421422Если423424[`dwFlags`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO.dwFlags)425426указывает427428[`STARTF_USESTDHANDLES`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTF_USESTDHANDLES)429430, этот член является дескриптором стандартного вывода ошибок для процесса. В противном случае этот член игнорируется, и по умолчанию для стандартного вывода ошибок используется буфер окна консоли.431432#### `wShowWindow`433434Если [`dwFlags`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO.dwFlags) указывает [`STARTF_USESHOWWINDOW`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTF_USESHOWWINDOW), этот член может принимать любое из значений, которые можно указать в параметре `nCmdShow` для функции [ShowWindow](https://python-all.ru/3.1/library/subprocess.html), за исключением `SW_SHOWDEFAULT`. В противном случае этот член игнорируется.435436Для этого атрибута предусмотрено значение [`SW_HIDE`](https://python-all.ru/3.1/library/subprocess.html#subprocess.SW_HIDE). Оно используется, когда [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen) вызывается с параметром `shell=True`.437438### 17.1.3.1. Константы439440Модуль `подпроцесс` предоставляет следующие константы.441442#### `subprocess.STD_INPUT_HANDLE`443444Устройство стандартного ввода. Изначально это буфер ввода консоли,445446`CONIN$`447448.449450#### `subprocess.STD_OUTPUT_HANDLE`451452Устройство стандартного вывода. Изначально это активный экранный буфер консоли,453454`CONOUT$`455456.457458#### `subprocess.STD_ERROR_HANDLE`459460Устройство стандартного вывода ошибок. Изначально это активный экранный буфер консоли,461462`CONOUT$`463464.465466#### `subprocess.SW_HIDE`467468Скрывает окно. Другое окно будет активировано.469470#### `subprocess.STARTF_USESTDHANDLES`471472Указывает, что члены473474[`STARTUPINFO.hStdInput`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO.hStdInput)475476,477478[`STARTUPINFO.hStdOutput`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO.hStdOutput)479480и481482[`STARTUPINFO.hStdError`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO.hStdError)483484содержат дополнительную информацию.485486#### `subprocess.STARTF_USESHOWWINDOW`487488Указывает, что член489490[`STARTUPINFO.wShowWindow`](https://python-all.ru/3.1/library/subprocess.html#subprocess.STARTUPINFO.wShowWindow)491492содержит дополнительную информацию.493494#### `subprocess.CREATE_NEW_CONSOLE`495496Новый процесс получает новую консоль вместо наследования консоли родителя (по умолчанию).497498Этот флаг всегда устанавливается, когда [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen) создаётся с `shell=True`.499500## 17.1.4. Замена старых функций модулем подпроцесс501502В этом разделе «a ==\> b» означает, что b можно использовать как замену a.503504> **Примечание**505>506> Все функции в этом разделе (более или менее) молча завершаются ошибкой, если выполняемая программа не может быть найдена; этот модуль вызывает исключение [`OSError`](https://python-all.ru/3.1/library/exceptions.html#OSError).507508В следующих примерах предполагается, что модуль подпроцесс импортирован с помощью «from subprocess import \*».509510### 17.1.4.1. Замена обратных кавычек оболочки /bin/sh511512```python513output=`mycmd myarg`514==>515output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]516```517518### 17.1.4.2. Замена конвейера оболочки519520```python521output=`dmesg | grep hda`522==>523p1 = Popen(["dmesg"], stdout=PIPE)524p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)525p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.526output = p2.communicate()[0]527```528529Вызов p1.stdout.close() после запуска p2 важен для того, чтобы p1 получил SIGPIPE, если p2 завершится раньше p1.530531### 17.1.4.3. Замена [`os.system()`](https://python-all.ru/3.1/library/os.html#os.system)532533```python534sts = os.system("mycmd" + " myarg")535==>536p = Popen("mycmd" + " myarg", shell=True)537sts = os.waitpid(p.pid, 0)[1]538```539540Примечания:541542- Вызов программы через оболочку обычно не требуется.543- Проще смотреть на атрибут `returncode`, чем на код завершения.544545Более реалистичный пример выглядит так:546547```python548try:549 retcode = call("mycmd" + " myarg", shell=True)550 if retcode < 0:551 print("Child was terminated by signal", -retcode, file=sys.stderr)552 else:553 print("Child returned", retcode, file=sys.stderr)554except OSError as e:555 print("Execution failed:", e, file=sys.stderr)556```557558### 17.1.4.4. Замена семейства [`os.spawn`](https://python-all.ru/3.1/library/os.html#os.spawnl)559560Пример P\_NOWAIT:561562```python563pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")564==>565pid = Popen(["/bin/mycmd", "myarg"]).pid566```567568Пример P\_WAIT:569570```python571retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")572==>573retcode = call(["/bin/mycmd", "myarg"])574```575576Пример с вектором:577578```python579os.spawnvp(os.P_NOWAIT, path, args)580==>581Popen([path] + args[1:])582```583584Пример с окружением:585586```python587os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)588==>589Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})590```591592### 17.1.4.5. Замена `os.popen()`, `os.popen2()`, `os.popen3()`593594```python595(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)596==>597p = Popen(cmd, shell=True, bufsize=bufsize,598 stdin=PIPE, stdout=PIPE, close_fds=True)599(child_stdin, child_stdout) = (p.stdin, p.stdout)600```601602```python603(child_stdin,604 child_stdout,605 child_stderr) = os.popen3(cmd, mode, bufsize)606==>607p = Popen(cmd, shell=True, bufsize=bufsize,608 stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)609(child_stdin,610 child_stdout,611 child_stderr) = (p.stdin, p.stdout, p.stderr)612```613614```python615(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)616==>617p = Popen(cmd, shell=True, bufsize=bufsize,618 stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)619(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)620```621622Обработка кода возврата выполняется следующим образом:623624```python625pipe = os.popen(cmd, 'w')626...627rc = pipe.close()628if rc is not None and rc >> 8:629 print("There were some errors")630==>631process = Popen(cmd, 'w', stdin=PIPE)632...633process.stdin.close()634if process.wait() != 0:635 print("There were some errors")636```637638### 17.1.4.6. Замена функций из модуля `popen2`639640> **Примечание**641>642> Если аргумент cmd функций popen2 является строкой, команда выполняется через /bin/sh. Если это список, команда выполняется напрямую.643644```python645(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)646==>647p = Popen(["somestring"], shell=True, bufsize=bufsize,648 stdin=PIPE, stdout=PIPE, close_fds=True)649(child_stdout, child_stdin) = (p.stdout, p.stdin)650```651652```python653(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)654==>655p = Popen(["mycmd", "myarg"], bufsize=bufsize,656 stdin=PIPE, stdout=PIPE, close_fds=True)657(child_stdout, child_stdin) = (p.stdout, p.stdin)658```659660`popen2.Popen3` и `popen2.Popen4` в основном работают как [`subprocess.Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen), за исключением того, что:661662- [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen) возбуждает исключение, если выполнение завершается неудачей.663- аргумент *capturestderr* заменён аргументом *stderr*.664- Необходимо указать `stdin=PIPE` и `stdout=PIPE`.665- popen2 по умолчанию закрывает все файловые дескрипторы, но необходимо указать `close_fds=True` в [`Popen`](https://python-all.ru/3.1/library/subprocess.html#subprocess.Popen).666667## 17.1.5. Примечания668669### 17.1.5.1. Преобразование последовательности аргументов в строку в Windows670671В Windows последовательность *args* преобразуется в строку, которая может быть разобрана с помощью следующих правил (которые соответствуют правилам, используемым в MS C runtime):6726731. Аргументы разделяются пробельными символами, то есть пробелом или табуляцией.6742. Строка, заключённая в двойные кавычки, интерпретируется как один аргумент, независимо от пробельных символов внутри неё. Строка в кавычках может быть встроена в аргумент.6753. Двойная кавычка, перед которой стоит обратная косая черта, интерпретируется как литеральная двойная кавычка.6764. Обратные косые черты интерпретируются буквально, если только они не стоят непосредственно перед двойной кавычкой.6775. Если обратные косые черты стоят непосредственно перед двойной кавычкой, каждая пара обратных косых черт интерпретируется как литеральная обратная косая черта. Если количество обратных косых черт нечётное, последняя обратная косая черта экранирует следующую за ней двойную кавычку, как описано в правиле 3.678