subprocess — Управление дочерними процессами
Исходный код: Lib/subprocess.py
Модуль subprocess позволяет запускать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать их коды возврата. Этот модуль предназначен для замены нескольких более старых модулей и функций:
os.system os.spawn*
Информация о том, как модуль subprocess может быть использован для замены этих модулей и функций, содержится в следующих разделах.
См. также
PEP 324 — PEP, предлагающий модуль subprocess
Использование модуля subprocess
Рекомендуемый подход к вызову дочерних процессов — использование функции run() для всех случаев, которые она может обработать. Для более сложных случаев можно напрямую использовать базовый интерфейс Popen.
-
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs) -
Запустить команду, описанную в args. Подождать завершения команды, а затем вернуть экземпляр
CompletedProcess.Приведенные выше аргументы — лишь наиболее распространённые, описанные ниже в Часто используемые аргументы (отсюда использование обозначений только ключевых слов в сокращённой сигнатуре). Полная сигнатура функции в основном такая же, как у конструктора
Popen— большинство аргументов этой функции передаются этому интерфейсу. (timeout, input, check и capture_output — нет.)Если capture_output равно true, stdout и stderr будут захвачены. При использовании внутренний объект
Popenавтоматически создаётся сstdout=PIPEиstderr=PIPE. Аргументы stdout и stderr не могут быть заданы одновременно с capture_output. Если вы хотите захватить и объединить оба потока в один, используйтеstdout=PIPEиstderr=STDOUTвместо capture_output.Аргумент timeout передаётся в
Popen.communicate(). Если таймаут истекает, дочерний процесс будет убит и подождёт завершения. ИсключениеTimeoutExpiredбудет повторно поднято после завершения дочернего процесса.Аргумент input передаётся в
Popen.communicate(), а следовательно, в стандартный ввод дочернего процесса. Если используется, это должно быть последовательность байтов или строка, если указаны encoding или errors, или text равно true. При использовании внутренний объектPopenавтоматически создаётся сstdin=PIPE, и аргумент stdin также не может использоваться.Если check равно true и процесс завершается с ненулевым кодом возврата, будет поднято исключение
CalledProcessError. Атрибуты этого исключения содержат аргументы, код возврата и stdout и stderr, если они были захвачены.Если заданы encoding или errors, или text равно true, файлы для stdin, stdout и stderr открываются в текстовом режиме с указанным encoding и errors или значением по умолчанию
io.TextIOWrapper. Аргумент universal_newlines эквивалентен text и предоставляется для обратной совместимости. По умолчанию файлы открываются в двоичном режиме.Если env не
None, это должно быть отображение, определяющее переменные среды для нового процесса; они используются вместо поведения по умолчанию, наследующего текущую среду процесса. Это передаётся непосредственно вPopen. Это отображение может быть строка к строке на любой платформе или байты к байтам на платформах POSIX, очень похоже наos.environилиos.environb.Примеры:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output CompletedProcess(args=['ls', '-l'], returncode=0) >>> subprocess.run("exit 1", shell=True, check=True) Traceback (most recent call last): ... subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 >>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True) CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')Добавлено в версии 3.5.
Изменено в версии 3.6: Добавлены параметры encoding и errors
Изменено в версии 3.7: Добавлен параметр text, как более понятный псевдоним для universal_newlines. Добавлен параметр capture_output.
Изменено в версии 3.10.11: Изменён порядок поиска оболочки Windows для
shell=True. Текущая директория и%PATH%заменены на%COMSPEC%и%SystemRoot%\System32\cmd.exe. В результате, размещение вредоносной программы с именемcmd.exeв текущей директории больше не работает.
-
class subprocess.CompletedProcess -
Значение возврата из
run(), представляющее процесс, который завершился.-
args -
Аргументы, используемые для запуска процесса. Это может быть список или строка.
-
returncode -
Код завершения дочернего процесса. Обычно код завершения 0 указывает на успешное выполнение.
Отрицательное значение
-Nуказывает, что дочерний процесс был завершён сигналомN(только POSIX).
-
stdout -
Захваченный stdout дочернего процесса. Последовательность байтов или строка, если
run()был вызван с кодировкой, ошибками или text=True.Noneесли stdout не был захвачен.Если вы запустили процесс с
stderr=subprocess.STDOUT, stdout и stderr будут объединены в этом атрибуте, иstderrбудетNone.
-
stderr -
Захваченный stderr дочернего процесса. Последовательность байтов или строка, если
run()был вызван с кодировкой, ошибками или text=True.Noneесли stderr не был захвачен.
-
check_returncode() -
Если
returncodeненулевой, поднять исключениеCalledProcessError.
Добавлено в версии 3.5.
-
-
subprocess.DEVNULL -
Специальное значение, которое может использоваться в качестве аргумента stdin, stdout или stderr для
Popenи указывает, что будет использован специальный файлos.devnull.Добавлено в версии 3.3.
-
subprocess.PIPE -
Специальное значение, которое может использоваться в качестве аргумента stdin, stdout или stderr для
Popenи указывает, что должен быть открыт канал к стандартному потоку. Наиболее полезно сPopen.communicate().
-
subprocess.STDOUT -
Специальное значение, которое может использоваться в качестве аргумента stderr для
Popenи указывает, что стандартная ошибка должна попасть в тот же дескриптор, что и стандартный вывод.
-
exception subprocess.SubprocessError -
Базовый класс для всех других исключений из этого модуля.
Добавлено в версии 3.3.
-
exception subprocess.TimeoutExpired -
Подкласс
SubprocessError, генерируется при истечении таймаута ожидания дочернего процесса.-
cmd -
Команда, использовавшаяся для запуска дочернего процесса.
-
timeout -
Таймаут в секундах.
-
output -
Вывод дочернего процесса, если он был перехвачен функцией
run()илиcheck_output(). В противном случае,None. Это всегдаbytes, если вывод был перехвачен, независимо от настройкиtext=True. Может остатьсяNone, а неb'', если вывод отсутствовал.
-
stdout -
Псевдоним для output, для симметрии с
stderr.
-
stderr -
Вывод stderr дочернего процесса, если он был перехвачен функцией
run(). В противном случае,None. Это всегдаbytes, если вывод stderr был перехвачен, независимо от настройкиtext=True. Может остатьсяNone, а неb'', если вывод stderr отсутствовал.
Добавлена в версии 3.3.
Изменено в версии 3.5: Добавлены атрибуты stdout и stderr
-
-
exception subprocess.CalledProcessError -
Подкласс
SubprocessError, генерируется, когда процесс, запущенный с помощьюcheck_call(),check_output()илиrun()(сcheck=True) возвращает ненулевой код выхода.-
returncode -
Код выхода дочернего процесса. Если процесс завершился из-за сигнала, это будет отрицательное значение номера сигнала.
-
cmd -
Команда, использовавшаяся для запуска дочернего процесса.
-
output -
Вывод дочернего процесса, если он был перехвачен функцией
run()илиcheck_output(). В противном случае,None.
-
stdout -
Псевдоним для output, для симметрии с
stderr.
-
stderr -
Вывод stderr дочернего процесса, если он был перехвачен функцией
run(). В противном случае,None.
Изменено в версии 3.5: Добавлены атрибуты stdout и stderr
-
Часто используемые аргументы
Для поддержки широкого спектра сценариев использования конструктор Popen (и функции-обёртки) принимает большое количество необязательных аргументов. Для большинства типичных случаев многие из этих аргументов можно безопасно оставить по умолчанию. Аргументы, которые чаще всего требуются, это:
args требуется для всех вызовов и должен быть строкой или последовательностью аргументов программы. Предоставление последовательности аргументов предпочтительнее, так как это позволяет модулю позаботиться о необходимости экранирования и кавычек аргументов (например, чтобы разрешить пробелы в именах файлов). Если передаётся строка, то либо shell должен быть True (см. ниже), либо строка должна просто называть программу для выполнения без указания каких-либо аргументов.
stdin, stdout и stderr указывают соответственно стандартные потоки ввода, вывода и стандартные ошибки выполняемой программы. Допустимые значения — PIPE, DEVNULL, существующий дескриптор файла (положительное целое число), существующий объект файла с допустимым дескриптором файла и None. PIPE указывает на создание нового канала для дочернего процесса. DEVNULL указывает, что будет использован специальный файл os.devnull. При значениях по умолчанию для None, перенаправление не произойдёт; дескрипторы файлов дочернего процесса будут унаследованы от родительского. Кроме того, stderr может быть STDOUT, что указывает на то, что данные stderr от дочернего процесса должны быть сохранены в том же файловом дескрипторе, что и stdout.
Если заданы encoding или errors, или text (также известное как universal_newlines) равно True, то объекты файлов stdin, stdout и stderr будут открыты в текстовом режиме с использованием указанных в вызове encoding и errors, или значений по умолчанию для io.TextIOWrapper.
Для stdin символы перевода строки '\n' на входе будут преобразованы в стандартный разделитель строк os.linesep. Для stdout и stderr все символы перевода строки в выводе будут преобразованы в '\n'. Для получения дополнительной информации см. документацию по классу io.TextIOWrapper, когда аргумент newline в его конструкторе равен None.
Если текстовый режим не используется, stdin, stdout и stderr будут открыты как двоичные потоки. Никакое кодирование или преобразование символов перевода строк не выполняется.
Новое в версии 3.6: Добавлены параметры encoding и errors.
Новое в версии 3.7: Добавлен параметр text как псевдоним для universal_newlines.
Примечание
Атрибут newlines объектов файлов Popen.stdin, Popen.stdout и Popen.stderr не обновляются методом Popen.communicate().
Если shell равно True, указанная команда будет выполнена через оболочку. Это может быть полезно, если вы используете Python в основном для расширенного управления потоком в отличие от большинства системных оболочек и всё ещё хотите получить удобный доступ к другим функциям оболочки, таким как оболочковые каналы, подстановки имён файлов, расширение переменных среды и расширение ~ до домашнего каталога пользователя. Однако обратите внимание, что сам Python предлагает реализации многих подобных функций оболочки (в частности, glob, fnmatch, os.walk(), os.path.expandvars(), os.path.expanduser() и shutil).
Изменено в версии 3.3: Когда universal_newlines равно True, класс использует кодировку locale.getpreferredencoding(False) вместо locale.getpreferredencoding(). Дополнительную информацию об этом изменении см. в классе io.TextIOWrapper.
Примечание
Перед использованием shell=True ознакомьтесь с разделом «Рекомендации по безопасности».
Эти опции, а также все остальные опции, подробно описаны в документации конструктора Popen.
Конструктор Popen
Создание и управление основными процессами в этом модуле осуществляется классом Popen. Он предлагает значительную гибкость, позволяя разработчикам обрабатывать менее распространённые случаи, не охваченные функциями-обёртками.
-
class subprocess.Popen(args, bufsize=- 1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=- 1, encoding=None, errors=None, text=None, pipesize=- 1) -
Выполнить дочернюю программу в новом процессе. В POSIX класс использует поведение, подобное
os.execvpe(), для выполнения дочерней программы. В Windows класс использует функцию WindowsCreateProcess(). Аргументы дляPopenследующие.args должно быть последовательностью аргументов программы или же одной строкой или объектом-путь. По умолчанию программой для выполнения является первый элемент в args, если args является последовательностью. Если args является строкой, интерпретация зависит от платформы и описана ниже. Смотрите аргументы shell и executable для дополнительных отличий от поведения по умолчанию. Если не указано иное, рекомендуется передавать args как последовательность.
Предупреждение
Для максимальной надёжности используйте полное имя файла исполняемого файла. Для поиска неопределённого имени на
PATH, используйтеshutil.which(). На всех платформах рекомендуемым способом запуска текущего интерпретатора Python повторно является передачаsys.executable, и используйте формат командной строки-mдля запуска установленного модуля.Разрешение пути executable (или первого элемента args) зависит от платформы. Для POSIX см.
os.execvpe(), и обратите внимание, что при разрешении или поиске пути исполняемого файла cwd переопределяет текущую рабочую директорию, а env может переопределить переменную средыPATH. Для Windows см. документацию параметровlpApplicationNameиlpCommandLineWinAPICreateProcess, и обратите внимание, что при разрешении или поиске пути исполняемого файла сshell=False, cwd не переопределяет текущую рабочую директорию, а env не может переопределить переменную средыPATH. Использование полного пути исключает все эти вариации.Пример передачи некоторых аргументов внешней программе как последовательности:
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
В POSIX, если args — строка, строка интерпретируется как имя или путь к программе для выполнения. Однако это возможно только если не передаются аргументы в программу.
Примечание
Может не быть очевидно, как разбить командную строку на последовательность аргументов, особенно в сложных случаях.
shlex.split()может проиллюстрировать, как определить правильную токенизацию для args:>>> import shlex, subprocess >>> command_line = input() /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'" >>> args = shlex.split(command_line) >>> print(args) ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"] >>> p = subprocess.Popen(args) # Success!
Обратите особое внимание на то, что опции (например, -input) и аргументы (например, eggs.txt), разделённые пробелами в командной строке, попадают в отдельные элементы списка, в то время как аргументы, требующие кавычек или экранирования обратной косой чертой при использовании в командной строке (например, имена файлов, содержащие пробелы или команда echo, показанная выше), являются отдельными элементами списка.
В Windows, если args — последовательность, она будет преобразована в строку способом, описанным в Преобразование последовательности аргументов в строку в Windows. Это связано с тем, что базовая функция
CreateProcess()работает со строками.Изменено в версии 3.6: Параметр args принимает объект-путь, если shell —
Falseи последовательность, содержащую объекты-пути в POSIX.Изменено в версии 3.8: Параметр args принимает объект-путь, если shell —
Falseи последовательность, содержащую байты и объекты-пути в Windows.Аргумент shell (который по умолчанию равен
False) указывает, использовать ли оболочку в качестве программы для выполнения. Если shell —True, рекомендуется передавать args как строку, а не как последовательность.В POSIX с
shell=True, оболочка по умолчанию равна/bin/sh. Если args — строка, строка определяет команду для выполнения через оболочку. Это означает, что строка должна быть отформатирована точно так же, как она вводилась бы в командной строке. Это включает, например, кавычки или экранирование обратной косой чертой имён файлов с пробелами в них. Если args — последовательность, первый элемент определяет строку команды, а все дополнительные элементы будут обрабатываться как дополнительные аргументы для самой оболочки. То есть,Popenвыполняет эквивалент:Popen(['/bin/sh', '-c', args[0], args[1], ...])
В Windows с
shell=True, переменная средыCOMSPECопределяет оболочку по умолчанию. Единственный случай, когда вам нужно указатьshell=Trueв Windows, — это когда команда, которую вы хотите выполнить, встроена в оболочку (например, dir или copy). Вам не нужноshell=Trueдля запуска пакетного файла или консольной исполняемой программы.Примечание
Прочитайте раздел Рекомендации по безопасности перед использованием
shell=True.bufsize будет передан в качестве соответствующего аргумента функции
open()при создании объектов файлов stdin/stdout/stderr:-
0означает небуферизованный режим (чтение и запись производятся одной системой вызова и могут возвращать короткие данные) -
1означает буферизацию по строкам (используется только еслиtext=Trueилиuniversal_newlines=True) - любое другое положительное значение означает использование буфера примерно такого размера
- отрицательное значение bufsize (по умолчанию) означает использование системного значения по умолчанию io.DEFAULT_BUFFER_SIZE.
Изменено в версии 3.3.1: bufsize теперь по умолчанию имеет значение -1, что позволяет по умолчанию использовать буферизацию для соответствия поведению, ожидаемому большинством кода. В версиях до Python 3.2.4 и 3.3.1 по умолчанию неправильно устанавливалось значение
0, что означало небуферизованный режим и допускало короткие чтения. Это было непреднамеренно и не соответствовало поведению Python 2, как ожидалось большинством кода.Аргумент executable задаёт заменяемую программу для выполнения. Он редко требуется. Когда
shell=False, executable заменяет программу для выполнения, заданную параметром args. Однако исходное значение args всё ещё передаётся программе. Большинство программ обрабатывают программу, указанную в args, как имя команды, что может отличаться от фактически исполняемой программы. В POSIX имя args становится отображаемым именем исполняемого файла в таких утилитах, как ps. Еслиshell=True, в POSIX аргумент executable задаёт заменяющую оболочку для значения по умолчанию/bin/sh.Изменено в версии 3.6: Параметр executable принимает объект-путь в POSIX.
Изменено в версии 3.8: Параметр executable принимает байты и объекты-пути в Windows.
Изменено в версии 3.10.11: Изменён порядок поиска оболочки Windows для
shell=True. Текущая директория и%PATH%заменяются на%COMSPEC%и%SystemRoot%\System32\cmd.exe. В результате, размещение вредоносной программы с именемcmd.exeв текущую директорию больше не работает.stdin, stdout и stderr определяют стандартный ввод, стандартный вывод и стандартный вывод ошибок выполняемой программы соответственно. Допустимые значения —
PIPE,DEVNULL, существующий дескриптор файла (положительное целое число), существующий объект файла с действительным дескриптором файла иNone.PIPEозначает, что должен быть создан новый канал в дочерний процесс.DEVNULLозначает, что будет использоваться специальный файлos.devnull. При значениях по умолчаниюNone, перенаправления не произойдёт; дескрипторы файлов дочернего процесса будут унаследованы от родительского. Кроме того, stderr может бытьSTDOUT, что означает, что данные stderr приложения должны быть получены в тот же файл, что и stdout.Если preexec_fn задано в вызываемый объект, этот объект будет вызван в дочернем процессе непосредственно перед выполнением дочернего процесса. (Только POSIX)
Предупреждение
Параметр preexec_fn небезопасен при использовании потоков в вашем приложении. Дочерний процесс может заблокироваться до вызова exec. Если вам необходимо его использовать, сделайте его простым! Минимизируйте количество вызываемых библиотек.
Примечание
Если вам нужно изменить среду для дочернего процесса, используйте параметр env, а не делайте это в preexec_fn. Параметр start_new_session может заменить ранее распространённое использование preexec_fn для вызова os.setsid() в дочернем процессе.
-
Изменено в версии 3.8: Параметр preexec_fn больше не поддерживается в подинтерпретаторах. Использование параметра в подинтерпретаторе вызывает
RuntimeError. Новое ограничение может повлиять на приложения, развернутые в mod_wsgi, uWSGI и других встроенных средах.Если close_fds имеет значение true, все дескрипторы файлов, кроме
0,1и2, будут закрыты перед выполнением дочернего процесса. В противном случае, когда close_fds имеет значение false, дескрипторы файлов подчиняются своему флагам наследуемости, как описано в Наследование дескрипторов файлов.В Windows, если close_fds имеет значение true, никакие дескрипторы не будут унаследованы дочерним процессом, если явно не указаны в элементе
handle_listобъектаSTARTUPINFO.lpAttributeListили стандартным перенаправлением дескрипторов.Изменено в версии 3.2: Значение по умолчанию для close_fds было изменено с
Falseна описанное выше.Изменено в версии 3.7: В Windows значение по умолчанию для close_fds было изменено с
FalseнаTrueпри перенаправлении стандартных дескрипторов. Теперь можно установить close_fds вTrueпри перенаправлении стандартных дескрипторов.pass_fds — это необязательная последовательность дескрипторов файлов, которые должны оставаться открытыми между родительским и дочерним процессами. Указание любого значения pass_fds принудительно устанавливает close_fds в
True. (Только POSIX)Изменено в версии 3.2: Параметр pass_fds был добавлен.
Если cwd не
None, функция изменяет рабочую директорию на cwd перед выполнением дочернего процесса. cwd может быть строкой, байтовым объектом или объектом-путь. В POSIX функция ищет executable (или первый элемент в args) относительно cwd, если путь к исполняемому файлу является относительным.Изменено в версии 3.6: Параметр cwd принимает объект-путь в POSIX.
Изменено в версии 3.7: Параметр cwd принимает объект-путь в Windows.
Изменено в версии 3.8: Параметр cwd принимает байтовый объект в Windows.
Если restore_signals имеет значение true (по умолчанию), все сигналы, которые Python установил в SIG_IGN, восстанавливаются до SIG_DFL в дочернем процессе перед exec. В настоящее время это включает сигналы SIGPIPE, SIGXFZ и SIGXFSZ. (Только POSIX)
Изменено в версии 3.2: Добавлен параметр restore_signals.
Если start_new_session имеет значение true, вызов системной функции setsid() будет сделан в дочернем процессе перед выполнением дочернего процесса. (Только POSIX)
Изменено в версии 3.2: Добавлен параметр start_new_session.
Если group не
None, вызов системной функции setregid() будет сделан в дочернем процессе перед выполнением дочернего процесса. Если предоставленное значение является строкой, оно будет найдено с помощьюgrp.getgrnam(), и значение изgr_gidбудет использовано. Если значение является целым числом, оно будет передано без изменений. (Только POSIX)Доступность: POSIX
Введено в версии 3.9.
Если extra_groups не
None, вызов системной функции setgroups() будет сделан в дочернем процессе перед выполнением дочернего процесса. Строки, предоставленные в extra_groups, будут найдены с помощьюgrp.getgrnam(), а значения изgr_gidбудут использованы. Целые значения будут переданы без изменений. (Только POSIX)Доступность: POSIX
Введено в версии 3.9.
Если user не
None, вызов системной функции setreuid() будет сделан в дочернем процессе перед выполнением дочернего процесса. Если предоставленное значение является строкой, оно будет найдено с помощьюpwd.getpwnam(), а значение изpw_uidбудет использовано. Если значение является целым числом, оно будет передано без изменений. (Только POSIX)Доступность: POSIX
Введено в версии 3.9.
Если umask не отрицательно, вызов системной функции umask() будет сделан в дочернем процессе перед выполнением дочернего процесса.
Доступность: POSIX
Введено в версии 3.9.
Если env не
None, оно должно быть отображением, определяющим переменные среды для нового процесса; они используются вместо стандартного поведения наследования среды текущего процесса. Это отображение может быть str к str на любой платформе или bytes к bytes на POSIX платформах, подобноos.environилиos.environb.Примечание
Если указано, env должно содержать все переменные, необходимые для выполнения программы. В Windows, для запуска side-by-side assembly, указанное env должно содержать действительную
SystemRoot.Если указаны encoding или errors, или text имеет значение true, файлы stdin, stdout и stderr открываются в текстовом режиме с указанным кодированием и errors, как описано выше в Часто используемые аргументы. Аргумент universal_newlines эквивалентен text и предоставлен для обратной совместимости. По умолчанию файлы открываются в двоичном режиме.
Введено в версии 3.6: Добавлены encoding и errors.
Введено в версии 3.7: Добавлен text как более удобочитаемый псевдоним для universal_newlines.
Если указан, startupinfo будет объектом
STARTUPINFO, который передаётся в функциюCreateProcess. creationflags, если задан, может содержать один или несколько из следующих флагов:CREATE_NEW_CONSOLECREATE_NEW_PROCESS_GROUPABOVE_NORMAL_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASSIDLE_PRIORITY_CLASSNORMAL_PRIORITY_CLASSREALTIME_PRIORITY_CLASSCREATE_NO_WINDOWDETACHED_PROCESSCREATE_DEFAULT_ERROR_MODECREATE_BREAKAWAY_FROM_JOB
pipesize может использоваться для изменения размера канала при использовании
PIPEдля stdin, stdout или stderr. Размер канала изменяется только на платформах, которые поддерживают это (в настоящее время только Linux). Другие платформы проигнорируют этот параметр.Введено в версии 3.10: Добавлен параметр
pipesize.
Объекты Popen поддерживаются как менеджеры контекста с помощью оператора
with: при выходе стандартные файловые дескрипторы закрываются, и процесс ожидает завершения.with Popen(["ifconfig"], stdout=PIPE) as proc: log.write(proc.stdout.read())Функции Popen и другие функции в этом модуле, использующие его, вызывают событие аудита
subprocess.Popenс аргументамиexecutable,args,cwd, иenv. Значение дляargsможет быть одной строкой или списком строк, в зависимости от платформы.Изменено в версии 3.2: Добавлена поддержка менеджера контекста.
Изменено в версии 3.6: Деструктор Popen теперь выводит предупреждение
ResourceWarning, если дочерний процесс всё ещё выполняется.Изменено в версии 3.8: Popen в некоторых случаях может использовать
os.posix_spawn()для повышения производительности. В Windows Subsystem for Linux и QEMU User Emulation конструктор Popen, использующийos.posix_spawn(), больше не вызывает исключение при ошибках, таких как отсутствие программы, но дочерний процесс завершается с ненулевымreturncode.
Исключения
Исключения, поднятые в дочернем процессе до запуска новой программы, будут перевыброшены в родительском процессе.
Наиболее распространённое исключение — OSError. Это происходит, например, при попытке выполнить несуществующий файл. Приложения должны быть готовы к исключениям OSError. Обратите внимание, что, когда shell=True, исключение OSError будет поднято дочерним процессом только в случае, если выбранная оболочка не найдена. Чтобы определить, не удалось ли оболочке найти запрашиваемое приложение, необходимо проверить код возврата или вывод из дочернего процесса.
ValueError будет поднято, если Popen вызывается с неверными аргументами.
check_call() и check_output() вызовут CalledProcessError, если вызванный процесс вернул ненулевой код возврата.
Все функции и методы, принимающие параметр timeout, такие как call() и Popen.communicate(), вызовут TimeoutExpired, если таймаут истечёт до завершения процесса.
Все исключения, определённые в этом модуле, наследуются от SubprocessError.
Новое в версии 3.3: Базовый класс SubprocessError был добавлен.
Безопасность при использовании subprocess
В отличие от некоторых других функций popen, данная реализация никогда не будет неявно вызывать системную оболочку. Это означает, что все символы, включая метасимволы оболочки, могут безопасно передаваться дочерним процессам. Если оболочка вызывается явно, через shell=True, приложение несет ответственность за обеспечение того, чтобы все пробелы и метасимволы были должным образом заключены в кавычки, чтобы избежать уязвимостей shell injection. На некоторых платформах для этой эскейп-обработки можно использовать shlex.quote().
Объекты Popen
Экземпляры класса Popen имеют следующие методы:
-
Popen.poll() -
Проверка завершения дочернего процесса. Установка и возвращение атрибута
returncode. В противном случае возвращаетNone.
-
Popen.wait(timeout=None) -
Ожидание завершения дочернего процесса. Установка и возвращение атрибута
returncodeатрибута.Если процесс не завершится через timeout секунд, вызывается исключение
TimeoutExpired. Безопасно перехватить это исключение и повторить ожидание.Примечание
Это приведет к тупику при использовании
stdout=PIPEилиstderr=PIPEи дочерний процесс генерирует достаточный вывод в канал, в результате чего он блокируется, ожидая, пока буфер канала ОС не примет больше данных. При использовании каналов используйтеPopen.communicate(), чтобы избежать этого.Примечание
Функция реализована с помощью цикла busy loop (неблокирующий вызов и короткие паузы). Используйте модуль
asyncioдля асинхронного ожидания: см.asyncio.create_subprocess_exec.Изменено в версии 3.3: Добавлен параметр timeout.
-
Popen.communicate(input=None, timeout=None) -
Взаимодействие с процессом: отправка данных на стандартный ввод. Чтение данных со стандартного вывода и стандартной ошибки до тех пор, пока не будет достигнут конец файла. Ожидание завершения процесса и установка атрибута
returncodeатрибута. Необязательный аргумент input должен содержать данные, которые необходимо отправить дочернему процессу, илиNone, если данные не должны отправляться. Если потоки были открыты в текстовом режиме, input должен быть строкой. В противном случае это должны быть байты.communicate()возвращает кортеж(stdout_data, stderr_data). Данные будут строками, если потоки были открыты в текстовом режиме; в противном случае — байтами.Обратите внимание, что если вы хотите отправить данные на стандартный ввод процесса, вам нужно создать объект Popen с
stdin=PIPE. Аналогично, для получения чего-либо, кромеNoneв кортеже результата, вам нужно указатьstdout=PIPEи/илиstderr=PIPE.Если процесс не завершится через timeout секунд, будет возбуждено исключение
TimeoutExpired. Перехват этого исключения и повторная попытка связи не приведет к потере вывода.Дочерний процесс не убивается, если истекает время ожидания, поэтому для надлежащей очистки хорошо работающее приложение должно убить дочерний процесс и завершить связь:
proc = subprocess.Popen(...) try: outs, errs = proc.communicate(timeout=15) except TimeoutExpired: proc.kill() outs, errs = proc.communicate()Примечание
Считанные данные буферизируются в памяти, поэтому не используйте этот метод, если размер данных большой или неограничен.
Изменено в версии 3.3: Добавлен параметр timeout.
-
Popen.send_signal(signal) -
Отправка сигнала signal дочернему процессу.
Ничего не делает, если процесс завершен.
Примечание
В Windows SIGTERM является псевдонимом для
terminate(). CTRL_C_EVENT и CTRL_BREAK_EVENT могут быть отправлены процессам, запущенным с параметром creationflags, включающимCREATE_NEW_PROCESS_GROUP.
-
Popen.terminate() -
Остановка дочернего процесса. В системах POSIX метод отправляет сигнал SIGTERM дочернему процессу. В Windows вызывается функция Win32 API
TerminateProcess()для остановки дочернего процесса.
-
Popen.kill() -
Уничтожение дочернего процесса. В системах POSIX функция отправляет сигнал SIGKILL дочернему процессу. В Windows
kill()является псевдонимом дляterminate().
Класс также устанавливает следующие атрибуты для доступа. Переопределение их значения не поддерживается:
-
Popen.args -
Аргумент args, как он был передан в
Popen– последовательность аргументов программы или же одна строка.Новое в версии 3.3.
-
Popen.stdin -
Если аргумент stdin был
PIPE, этот атрибут — это объект потока для записи, возвращаемыйopen(). Если были указаны аргументы encoding или errors, или аргумент text или universal_newlines былTrue, поток является текстовым, в противном случае — потоком байтов. Если аргумент stdin не былPIPE, этот атрибут —None.
-
Popen.stdout -
Если аргумент stdout был
PIPE, этот атрибут — это объект потока для чтения, возвращаемыйopen(). Чтение из потока предоставляет вывод дочернего процесса. Если были указаны аргументы encoding или errors, или аргумент text или universal_newlines былTrue, поток является текстовым, в противном случае — потоком байтов. Если аргумент stdout не былPIPE, этот атрибут —None.
-
Popen.stderr -
Если аргумент stderr был
PIPE, этот атрибут — это объект потока для чтения, возвращаемыйopen(). Чтение из потока предоставляет вывод ошибок дочернего процесса. Если были указаны аргументы encoding или errors, или аргумент text или universal_newlines былTrue, поток является текстовым, в противном случае — потоком байтов. Если аргумент stderr не былPIPE, этот атрибут —None.
Предупреждение
Используйте communicate() вместо .stdin.write, .stdout.read или .stderr.read, чтобы избежать тупиков из-за заполнения буферов канала ОС и блокировки дочернего процесса.
-
Popen.pid -
Идентификатор процесса дочернего процесса.
Обратите внимание, что если вы установили аргумент shell в
True, это идентификатор процесса созданного оболочки.
-
Popen.returncode -
Код возврата дочернего процесса, устанавливается методами
poll()иwait()(и косвенноcommunicate()). ЗначениеNoneуказывает на то, что процесс еще не завершился.Отрицательное значение
-Nуказывает на то, что дочерний процесс был завершен сигналомN(только для POSIX).
Windows Popen Помощники
Класс STARTUPINFO и следующие константы доступны только на Windows.
-
class subprocess.STARTUPINFO(*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None) -
Частичная поддержка структуры Windows STARTUPINFO используется для создания
Popen. Следующие атрибуты могут быть установлены, передавая их в качестве аргументов только с ключевыми словами.Изменено в версии 3.7: Добавлена поддержка аргументов только с ключевыми словами.
-
dwFlags -
Поле бита, которое определяет, используются ли определенные атрибуты
STARTUPINFOпри создании окна процесса.si = subprocess.STARTUPINFO() si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
-
hStdInput -
Если
dwFlagsуказывает наSTARTF_USESTDHANDLES, этот атрибут — дескриптор стандартного ввода процесса. ЕслиSTARTF_USESTDHANDLESне указан, по умолчанию для стандартного ввода используется буфер клавиатуры.
-
hStdOutput -
Если
dwFlagsуказывает наSTARTF_USESTDHANDLES, этот атрибут — дескриптор стандартного вывода процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартного вывода используется буфер окна консоли.
-
hStdError -
Если
dwFlagsуказывает наSTARTF_USESTDHANDLES, этот атрибут — дескриптор стандартной ошибки процесса. В противном случае этот атрибут игнорируется, и по умолчанию для стандартной ошибки используется буфер окна консоли.
-
wShowWindow -
Если
dwFlagsуказывает наSTARTF_USESHOWWINDOW, этот атрибут может принимать любое значение, которое может быть указано в параметреnCmdShowдля функции ShowWindow, за исключениемSW_SHOWDEFAULT. В противном случае этот атрибут игнорируется.SW_HIDEпредоставляется для этого атрибута. Он используется, когдаPopenвызывается сshell=True.
-
lpAttributeList -
Словарь дополнительных атрибутов для создания процесса, как указано в
STARTUPINFOEX, см. UpdateProcThreadAttribute.Поддерживаемые атрибуты:
- handle_list
-
Последовательность дескрипторов, которые будут унаследованы. close_fds должно быть true, если список не пуст.
Дескрипторы должны быть временно сделаны наследуемыми с помощью
os.set_handle_inheritable()при передаче в конструкторPopen, иначе будет поднята ошибкаOSErrorс кодом WindowsERROR_INVALID_PARAMETER(87).Предупреждение
В многопоточном процессе будьте осторожны, чтобы не допускать утечки дескрипторов, которые помечены как наследуемые, когда вы комбинируете эту функцию с одновременными вызовами других функций создания процессов, которые наследуют все дескрипторы, такие как
os.system(). Это также относится к перенаправлению стандартных дескрипторов, которое временно создает наследуемые дескрипторы.
Добавлен в версии 3.7.
-
Константы Windows
Модуль subprocess предоставляет следующие константы.
-
subprocess.STD_INPUT_HANDLE -
Устройство стандартного ввода. Изначально это буфер ввода консоли,
CONIN$.
-
subprocess.STD_OUTPUT_HANDLE -
Устройство стандартного вывода. Изначально это активный буфер экрана консоли,
CONOUT$.
-
subprocess.STD_ERROR_HANDLE -
Устройство стандартной ошибки. Изначально это активный буфер экрана консоли,
CONOUT$.
-
subprocess.SW_HIDE -
Скрывает окно. Будет активировано другое окно.
-
subprocess.STARTF_USESTDHANDLES -
Указывает, что атрибуты
STARTUPINFO.hStdInput,STARTUPINFO.hStdOutputиSTARTUPINFO.hStdErrorсодержат дополнительную информацию.
-
subprocess.STARTF_USESHOWWINDOW -
Указывает, что атрибут
STARTUPINFO.wShowWindowсодержит дополнительную информацию.
-
subprocess.CREATE_NEW_CONSOLE -
Новый процесс получает новую консоль вместо наследования консоли родительского процесса (по умолчанию).
-
subprocess.CREATE_NEW_PROCESS_GROUP -
Параметр
Popenдля указания создания новой группы процессов. Этот флаг необходим для использованияos.kill()для дочернего процесса.Этот флаг игнорируется, если указан
CREATE_NEW_CONSOLE.
-
subprocess.ABOVE_NORMAL_PRIORITY_CLASS -
Параметр
Popenдля указания того, что новый процесс будет иметь приоритет выше среднего.Добавлено в версии 3.7.
-
subprocess.BELOW_NORMAL_PRIORITY_CLASS -
Параметр
Popenдля указания того, что новый процесс будет иметь приоритет ниже среднего.Добавлено в версии 3.7.
-
subprocess.HIGH_PRIORITY_CLASS -
Параметр
Popenдля указания того, что новый процесс будет иметь высокий приоритет.Добавлено в версии 3.7.
-
subprocess.IDLE_PRIORITY_CLASS -
Параметр
Popenдля указания того, что новый процесс будет иметь приоритет ожидания (низкий).Добавлено в версии 3.7.
-
subprocess.NORMAL_PRIORITY_CLASS -
Параметр
Popenдля указания того, что новый процесс будет иметь нормальный приоритет. (по умолчанию)Добавлено в версии 3.7.
-
subprocess.REALTIME_PRIORITY_CLASS -
Параметр
Popenдля указания того, что новый процесс будет иметь приоритет реального времени. Почти никогда не используйте REALTIME_PRIORITY_CLASS, потому что это прерывает системные потоки, управляющие вводом мыши, вводом с клавиатуры и очисткой кэша диска в фоновом режиме. Этот класс может быть уместен для приложений, которые «разговаривают» напрямую с аппаратным обеспечением или выполняют кратковременные задачи, которые должны иметь ограниченные прерывания.Добавлено в версии 3.7.
-
subprocess.CREATE_NO_WINDOW -
Параметр
Popenдля указания того, что новый процесс не будет создавать окно.Добавлено в версии 3.7.
-
subprocess.DETACHED_PROCESS -
Параметр
Popenдля указания того, что новый процесс не будет наследовать консоль родительского процесса. Это значение нельзя использовать с CREATE_NEW_CONSOLE.Добавлено в версии 3.7.
-
subprocess.CREATE_DEFAULT_ERROR_MODE -
Параметр
Popenдля указания того, что новый процесс не наследует режим ошибок вызывающего процесса. Вместо этого новый процесс получает режим ошибок по умолчанию. Эта функция особенно полезна для многопоточных оболочек, которые работают с отключенными ошибками.Добавлено в версии 3.7.
-
subprocess.CREATE_BREAKAWAY_FROM_JOB -
Параметр
Popenдля указания того, что новый процесс не связан с задачей.Добавлено в версии 3.7.
Старые высокоуровневые API
До Python 3.5 эти три функции составляли высокоуровневый API для subprocess. Теперь во многих случаях можно использовать run(), но много существующего кода использует эти функции.
-
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs) -
Запустить команду, описанную параметром args. Подождать завершения команды, затем вернуть атрибут
returncode.Код, которому нужно получить stdout или stderr, должен использовать
run()вместо этого:run(...).returncode
Чтобы подавить stdout или stderr, укажите значение
DEVNULL.Указанные выше аргументы — лишь некоторые из общих. Полная сигнатура функции такая же, как у конструктора
Popen— эта функция передает все предоставленные аргументы, кроме timeout, непосредственно в этот интерфейс.Примечание
Не используйте
stdout=PIPEилиstderr=PIPEс этой функцией. Дочерний процесс заблокируется, если он сгенерирует достаточно вывода в канал, чтобы заполнить буфер канала ОС, так как каналы не читаются.Изменено в версии 3.3: Добавлен параметр timeout.
Изменено в версии 3.10.11: Изменён порядок поиска оболочки Windows для
shell=True. Текущий каталог и%PATH%заменены на%COMSPEC%и%SystemRoot%\System32\cmd.exe. В результате, размещение вредоносной программы с именемcmd.exeв текущем каталоге больше не работает.
-
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs) -
Запустить команду с аргументами. Подождать завершения команды. Если код возврата был равен нулю, то вернуть, иначе выбросить
CalledProcessError. ОбъектCalledProcessErrorбудет содержать код возврата в атрибутеreturncode. Еслиcheck_call()не смог запустить процесс, он будет передавать исключение, которое было возбуждено.Код, которому нужно получить stdout или stderr, должен использовать
run()вместо этого:run(..., check=True)
Чтобы подавить stdout или stderr, укажите значение
DEVNULL.Указанные выше аргументы — лишь некоторые из общих. Полная сигнатура функции такая же, как у конструктора
Popen— эта функция передает все предоставленные аргументы, кроме timeout, непосредственно в этот интерфейс.Примечание
Не используйте
stdout=PIPEилиstderr=PIPEс этой функцией. Дочерний процесс заблокируется, если он сгенерирует достаточно вывода в канал, чтобы заполнить буфер канала ОС, так как каналы не читаются.Изменено в версии 3.3: Добавлен параметр timeout.
Изменено в версии 3.10.11: Изменён порядок поиска оболочки Windows для
shell=True. Текущий каталог и%PATH%заменены на%COMSPEC%и%SystemRoot%\System32\cmd.exe. В результате, размещение вредоносной программы с именемcmd.exeв текущем каталоге больше не работает.
-
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None, **other_popen_kwargs) -
Запустить команду с аргументами и вернуть её вывод.
Если код возврата был не нулевым, он вызывает
CalledProcessError. ОбъектCalledProcessErrorбудет содержать код возврата в атрибутеreturncodeи любой вывод в атрибутеoutput.Это эквивалентно:
run(..., check=True, stdout=PIPE).stdout
Указанные выше аргументы — лишь некоторые из общих. Полная сигнатура функции в основном такая же, как у
run()— большинство аргументов передаются непосредственно в этот интерфейс. Существует одно отличие в API от поведенияrun(): передачаinput=Noneбудет вести себя так же, какinput=b''(илиinput='', в зависимости от других аргументов), а не использовать стандартный входной файл родительского процесса.По умолчанию эта функция возвращает данные в кодировке байтов. Фактическая кодировка выходных данных может зависеть от вызываемой команды, поэтому декодирование в текст часто необходимо обрабатывать на уровне приложения.
Это поведение можно переопределить, задав text, encoding, errors или universal_newlines значение
True, как описано в Часто используемые аргументы иrun().Чтобы также получить стандартную ошибку в результате, используйте
stderr=subprocess.STDOUT:>>> subprocess.check_output( ... "ls non_existent_file; exit 0", ... stderr=subprocess.STDOUT, ... shell=True) 'ls: non_existent_file: No such file or directory\n'
Введено в версии 3.1.
Изменено в версии 3.3: Добавлен параметр timeout.
Изменено в версии 3.4: Добавлена поддержка ключевого аргумента input.
Изменено в версии 3.6: Добавлены encoding и errors. Подробности см. в
run().Введено в версии 3.7: Добавлен text как более удобочитаемый псевдоним для universal_newlines.
Изменено в версии 3.10.11: Изменён порядок поиска оболочки Windows для
shell=True. Текущий каталог и%PATH%заменены на%COMSPEC%и%SystemRoot%\System32\cmd.exe. В результате, размещение вредоносной программы с именемcmd.exeв текущем каталоге больше не работает.
Замена устаревших функций модулем subprocess
В этом разделе «a заменяется на b» означает, что b может быть использовано как замена для a.
Примечание
Все функции «a» в этом разделе работают (более или менее) без ошибок, если исполняемая программа не найдена; соответствующие замены «b» вызывают исключение OSError вместо этого.
Кроме того, замены, использующие check_output(), завершатся ошибкой CalledProcessError, если запрашиваемая операция возвращает код ошибки (не ноль). Вывод по-прежнему доступен как атрибут output поднятого исключения.
В следующих примерах предполагается, что соответствующие функции уже импортированы из модуля subprocess.
Замена подстановки команд оболочки /bin/sh
output=$(mycmd myarg)
заменяется на:
output = check_output(["mycmd", "myarg"])
Замена конвейера оболочки
output=$(dmesg | grep hda)
заменяется на:
p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. output = p2.communicate()[0]
Вызов p1.stdout.close() после запуска p2 важен для того, чтобы p1 получил SIGPIPE, если p2 завершится до p1.
В качестве альтернативы, для проверенного ввода, собственная поддержка конвейера оболочки может по-прежнему использоваться напрямую:
output=$(dmesg | grep hda)
заменяется на:
output = check_output("dmesg | grep hda", shell=True)
Замена os.system()
sts = os.system("mycmd" + " myarg")
# becomes
retcode = call("mycmd" + " myarg", shell=True)
Примечания:
- Вызов программы через оболочку обычно не требуется.
- Значение возврата
call()закодировано иначе, чем значение возвратаos.system(). - Функция
os.system()игнорирует сигналы SIGINT и SIGQUIT во время выполнения команды, но при использовании модуляsubprocessэто необходимо сделать отдельно.
Более реалистичный пример:
try:
retcode = call("mycmd" + " myarg", shell=True)
if retcode < 0:
print("Child was terminated by signal", -retcode, file=sys.stderr)
else:
print("Child returned", retcode, file=sys.stderr)
except OSError as e:
print("Execution failed:", e, file=sys.stderr)
Замена семейства os.spawn
Пример P_NOWAIT:
pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") ==> pid = Popen(["/bin/mycmd", "myarg"]).pid
Пример P_WAIT:
retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") ==> retcode = call(["/bin/mycmd", "myarg"])
Пример с векторами:
os.spawnvp(os.P_NOWAIT, path, args) ==> Popen([path] + args[1:])
Пример с окружением:
os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
Замена os.popen(), os.popen2(), os.popen3()
(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
(child_stdin,
child_stdout,
child_stderr) = os.popen3(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
(child_stdin,
child_stdout,
child_stderr) = (p.stdin, p.stdout, p.stderr)
(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
Обработка кода возврата выполняется следующим образом:
pipe = os.popen(cmd, 'w')
...
rc = pipe.close()
if rc is not None and rc >> 8:
print("There were some errors")
==>
process = Popen(cmd, stdin=PIPE)
...
process.stdin.close()
if process.wait() != 0:
print("There were some errors")
Замена функций из модуля popen2
Примечание
Если аргумент cmd для функций popen2 является строкой, команда выполняется через /bin/sh. Если это список, команда выполняется напрямую.
(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
==>
p = Popen("somestring", shell=True, bufsize=bufsize,
stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)
(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
==>
p = Popen(["mycmd", "myarg"], bufsize=bufsize,
stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)
popen2.Popen3 и popen2.Popen4 работают в основном как subprocess.Popen, за исключением:
Popenвызывает исключение, если выполнение завершается неудачно.- Аргумент capturestderr заменяется на аргумент stderr.
stdin=PIPEиstdout=PIPEдолжны быть указаны.- popen2 по умолчанию закрывает все дескрипторы файлов, но вам необходимо указать
close_fds=TrueсPopen, чтобы гарантировать это поведение на всех платформах или в прошлых версиях Python.
Функции устаревшего вызова оболочки
Этот модуль также предоставляет следующие устаревшие функции из модуля 2.x commands. Эти операции неявно вызывают системную оболочку, и ни одно из описанных выше гарантий безопасности и согласованности обработки исключений недействительно для этих функций.
-
subprocess.getstatusoutput(cmd) -
Возвращает
(exitcode, output)выполнения cmd в оболочке.Выполняет строку cmd в оболочке с
Popen.check_output()и возвращает пару (exitcode, output). Используется кодировка по умолчанию; см. примечания к Часто используемые аргументы для получения дополнительной информации.Конец строки (\n) удаляется из вывода. Код выхода команды можно интерпретировать как код возврата subprocess. Пример:
>>> subprocess.getstatusoutput('ls /bin/ls') (0, '/bin/ls') >>> subprocess.getstatusoutput('cat /bin/junk') (1, 'cat: /bin/junk: No such file or directory') >>> subprocess.getstatusoutput('/bin/junk') (127, 'sh: /bin/junk: not found') >>> subprocess.getstatusoutput('/bin/kill $$') (-15, '')Доступность: POSIX и Windows.
Изменено в версии 3.3.4: Добавлена поддержка Windows.
Функция теперь возвращает (exitcode, output) вместо (status, output), как это было в Python 3.3.3 и ранее. exitcode имеет то же значение, что и
returncode.
-
subprocess.getoutput(cmd) -
Возвращает вывод (stdout и stderr) выполнения cmd в оболочке.
Аналогично
getstatusoutput(), за исключением того, что код выхода игнорируется, а значением возврата является строка, содержащая вывод команды. Пример:>>> subprocess.getoutput('ls /bin/ls') '/bin/ls'Доступность: POSIX и Windows.
Изменено в версии 3.3.4: Добавлена поддержка Windows
Примечания
Преобразование последовательности аргументов в строку в Windows
В Windows последовательность args преобразуется в строку, которая может быть обработана с помощью следующих правил (соответствующих правилам, используемым MS C runtime):
- Аргументы разделяются пробелами, которые могут быть пробелом или табуляцией.
- Строка, заключенная в двойные кавычки, интерпретируется как один аргумент, независимо от содержащихся в ней пробелов. В аргументе могут быть вложены строки в кавычках.
- Двойная кавычка, предваряемая обратной косой чертой, интерпретируется как буквальная двойная кавычка.
- Обратные косые черты интерпретируются буквально, за исключением случаев, когда они непосредственно предшествуют двойной кавычке.
- Если обратные косые черты непосредственно предшествуют двойной кавычке, каждая пара обратных косых черт интерпретируется как буквальная обратная косая черта. Если количество обратных косых черт нечетное, последняя обратная косая черта экранирует следующую двойную кавычку, как описано в правиле 3.
См. также
-
shlex -
Модуль, предоставляющий функции для разбора и экранирования командных строк.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/subprocess.html