subprocess
— Управление подпроцессами¶
Источник: Lib/subprocess.py
Модуль subprocess
позволяет порождать новые процессы, подключаться к их трубам ввода/вывода/ошибок и получать их коды возврата. Этот модуль призван заменить несколько старых модулей и функций:
os.system
os.spawn*
Информация о том, как модуль subprocess
может быть использован для замены этих модулей и функций, приведена в следующих разделах.
См.также
PEP 324 – PEP, предлагающий модуль подпроцесса
Availability: не WASI, не iOS.
Этот модуль не работает или недоступен на платформах WebAssembly или iOS. Дополнительные сведения о доступности WASM см. в разделе Платформы WebAssembly; о доступности iOS - в разделе iOS.
Использование 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 и stderr, установленными вPIPE
. Аргументы stdout и stderr не могут быть указаны одновременно с capture_output. Если вы хотите захватить и объединить оба потока в один, установите stdout вPIPE
и stderr вSTDOUT
, а не используйте capture_output.Можно указать таймаут в секундах, он внутренне передается в
Popen.communicate()
. Если таймаут истечет, дочерний процесс будет завершен и будет ожидать завершения. ИсключениеTimeoutExpired
будет повторно поднято после завершения дочернего процесса. Само создание начального процесса не может быть прервано во многих платформенных API, поэтому вы не гарантированно увидите исключение по таймауту, по крайней мере, после того, как создание процесса займет столько времени.Аргумент input передается в
Popen.communicate()
и, таким образом, в stdin подпроцесса. Если он используется, то должен быть последовательностью байтов, или строкой, если указаны кодировка или ошибки, или text является истиной. При использовании автоматически создается внутренний объект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
. Это отображение может быть str на str на любой платформе или bytes на bytes на 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'')
Added in version 3.5.
Изменено в версии 3.6: Добавлены параметры encoding и errors.
Изменено в версии 3.7: Добавлен параметр text, как более понятный псевдоним universal_newlines. Добавлен параметр capture_output.
Изменено в версии 3.12: Изменен порядок поиска в оболочке 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
.
Added in version 3.5.
- subprocess.DEVNULL¶
Специальное значение, которое может быть использовано в качестве аргумента stdin, stdout или stderr для
Popen
и указывает, что будет использоваться специальный файлos.devnull
.Added in version 3.3.
- subprocess.PIPE¶
Специальное значение, которое может использоваться в качестве аргумента stdin, stdout или stderr для
Popen
и указывает на необходимость открытия трубы к стандартному потоку. Наиболее полезно при использованииPopen.communicate()
.
- subprocess.STDOUT¶
Специальное значение, которое может быть использовано в качестве аргумента stderr к
Popen
и указывает, что стандартная ошибка должна передаваться в тот же хэндл, что и стандартный вывод.
- exception subprocess.SubprocessError¶
Базовый класс для всех остальных исключений из этого модуля.
Added in version 3.3.
- exception subprocess.TimeoutExpired¶
Подкласс
SubprocessError
, возникающий по истечении таймаута при ожидании дочернего процесса.- cmd¶
Команда, которая была использована для порождения дочернего процесса.
- timeout¶
Тайм-аут в секундах.
- output¶
Выход дочернего процесса, если он был захвачен
run()
илиcheck_output()
. В противном случае -None
. Это всегдаbytes
, если был перехвачен любой вывод, независимо от настройкиtext=True
. Он может оставатьсяNone
вместоb''
, если выход не наблюдался.
- stderr¶
Выход Stderr дочернего процесса, если он был захвачен
run()
. В противном случае -None
. Это всегдаbytes
, если вывод stderr был перехвачен, независимо от настройкиtext=True
. Может оставатьсяNone
вместоb''
, если вывод stderr не наблюдался.
Added in version 3.3.
Изменено в версии 3.5: Добавлены атрибуты stdout и stderr
- exception subprocess.CalledProcessError¶
Подкласс
SubprocessError
, возникающий, когда процесс, запущенный под управлениемcheck_call()
,check_output()
илиrun()
(сcheck=True
), возвращает ненулевой статус выхода.- returncode¶
Статус завершения дочернего процесса. Если процесс завершился из-за сигнала, это будет отрицательный номер сигнала.
- cmd¶
Команда, которая была использована для порождения дочернего процесса.
- output¶
Выход дочернего процесса, если он был захвачен
run()
илиcheck_output()
. В противном случае -None
.
Изменено в версии 3.5: Добавлены атрибуты stdout и stderr
Часто используемые аргументы¶
Для поддержки широкого спектра случаев использования конструктор Popen
(и вспомогательные функции) принимает большое количество необязательных аргументов. Для большинства типичных случаев использования многие из этих аргументов можно смело оставлять в значениях по умолчанию. Наиболее часто требуемыми аргументами являются:
args требуется для всех вызовов и должен представлять собой строку или последовательность аргументов программы. Предоставление последовательности аргументов обычно предпочтительнее, так как это позволяет модулю позаботиться о любом требуемом экранировании и кавычках аргументов (например, чтобы разрешить пробелы в именах файлов). Если передается одна строка, то либо shell должен быть
True
(см. ниже), либо строка должна просто называть программу, которая будет выполняться, без указания аргументов.stdin, stdout и stderr задают стандартный ввод, стандартный вывод и стандартную обработку файлов ошибок выполняемой программы, соответственно. Допустимые значения:
None
,PIPE
,DEVNULL
, существующий дескриптор файла (целое положительное число) и существующий file object с допустимым дескриптором файла. При настройках по умолчаниюNone
перенаправление не происходит.PIPE
указывает, что следует создать новый канал к дочернему файлу.DEVNULL
указывает, что будет использоваться специальный файлos.devnull
. Кроме того, 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 в первую очередь для расширенного потока управления, который он предлагает по сравнению с большинством системных оболочек, но при этом хотите иметь удобный доступ к другим функциям оболочки, таким как shell pipes, подстановочные знаки имен файлов, расширение переменных окружения и расширение~
до домашнего каталога пользователя. Однако обратите внимание, что сам Python предлагает реализацию многих shell-подобных функций (в частности,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
прочитайте раздел Security Considerations.
Эти и другие опции более подробно описаны в документации по конструктору 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, process_group=None)¶
Выполнение дочерней программы в новом процессе. В POSIX класс использует
os.execvpe()
-подобное поведение для выполнения дочерней программы. В Windows класс использует функцию WindowsCreateProcess()
. Аргументы дляPopen
следующие.В качестве args должна быть последовательность аргументов программы, иначе - одиночная строка или path-like object. По умолчанию программа для выполнения является первым элементом в args, если args - последовательность. Если args - строка, интерпретация зависит от платформы и описана ниже. Дополнительные отличия от поведения по умолчанию см. в аргументах shell и executable. Если не указано иное, рекомендуется передавать args в виде последовательности.
Предупреждение
Для максимальной надежности используйте полный путь к исполняемому файлу. Для поиска неквалифицированного имени по
PATH
используйтеshutil.which()
. На всех платформах рекомендуется передаватьsys.executable
для повторного запуска текущего интерпретатора Python, а для запуска установленного модуля использовать формат командной строки-m
.Разрешение пути executable (или первого элемента args) зависит от платформы. Для POSIX смотрите
os.execvpe()
, и обратите внимание, что при разрешении или поиске пути к исполняемому файлу cwd переопределяет текущий рабочий каталог, а env может переопределять переменную окруженияPATH
. Для Windows смотрите документацию по параметрамlpApplicationName
иlpCommandLine
WinAPICreateProcess
, а также обратите внимание, что при разрешении или поиске пути к исполняемому файлу с помощью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 принимает значение path-like object, если shell -
False
, и последовательность, содержащую объекты типа path на POSIX.Изменено в версии 3.8: Параметр args принимает значение path-like object, если shell -
False
, и последовательность, содержащую байты и объекты типа path в 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
прочитайте раздел Security Considerations.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 принимает значение path-like object в POSIX.
Изменено в версии 3.8: Параметр executable принимает байт и path-like object в Windows.
Изменено в версии 3.12: Изменен порядок поиска в оболочке Windows для
shell=True
. Текущий каталог и%PATH%
заменены на%COMSPEC%
и%SystemRoot%\System32\cmd.exe
. В результате сброс вредоносной программы с именемcmd.exe
в текущий каталог больше не работает.stdin, stdout и stderr задают стандартный ввод, стандартный вывод и стандартную обработку файлов ошибок выполняемой программы, соответственно. Допустимые значения:
None
,PIPE
,DEVNULL
, существующий дескриптор файла (целое положительное число) и существующий file object с допустимым дескриптором файла. При настройках по умолчаниюNone
перенаправление не происходит.PIPE
указывает, что следует создать новый канал к дочернему файлу.DEVNULL
указывает, что будет использоваться специальный файлos.devnull
. Кроме того, stderr может бытьSTDOUT
, что указывает на то, что данные stderr из приложений должны быть захвачены в тот же файловый хэндл, что и для stdout.Если preexec_fn имеет значение вызываемого объекта, то этот объект будет вызван в дочернем процессе непосредственно перед выполнением дочернего процесса. (Только POSIX)
Предупреждение
Параметр preexec_fn НЕЛЬЗЯ использовать при наличии потоков в вашем приложении. Дочерний процесс может зайти в тупик до вызова exec.
Примечание
Если вам нужно изменить окружение дочерней программы, используйте параметр env, а не делайте это в preexec_fn. Параметры start_new_session и process_group должны занять место кода, использующего preexec_fn для вызова
os.setsid()
илиos.setpgid()
в дочерней программе.Изменено в версии 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 может быть строкой, байтом или объектом path-like. На POSIX функция ищет executable (или первый элемент в args) относительно cwd, если путь к исполняемому файлу является относительным.Изменено в версии 3.6: Параметр cwd принимает значение path-like object в POSIX.
Изменено в версии 3.7: Параметр cwd принимает значение path-like object в Windows.
Изменено в версии 3.8: Параметр cwd принимает байтовый объект в Windows.
Если restore_signals равно true (по умолчанию), все сигналы, для которых Python установил значение SIG_IGN, будут восстановлены до значения SIG_DFL в дочернем процессе перед выполнением. В настоящее время это включает сигналы SIGPIPE, SIGXFZ и SIGXFSZ. (Только для POSIX)
Изменено в версии 3.2: Было добавлено restore_signals.
Если start_new_session равен true, то системный вызов
setsid()
будет выполнен в дочернем процессе до выполнения подпроцесса.Availability: POSIX
Изменено в версии 3.2: Была добавлена функция start_new_session.
Если process_group является неотрицательным целым числом, то системный вызов
setpgid(0, value)
будет выполнен в дочернем процессе до выполнения подпроцесса.Availability: POSIX
Изменено в версии 3.11: Была добавлена process_group.
Если group не является
None
, системный вызов setregid() будет выполнен в дочернем процессе до выполнения подпроцесса. Если переданное значение является строкой, оно будет просмотрено черезgrp.getgrnam()
и будет использовано значение вgr_gid
. Если значение является целым числом, оно будет передано дословно. (Только для POSIX)Availability: POSIX
Added in version 3.9.
Если extra_groups не
None
, то системный вызов setgroups() будет выполнен в дочернем процессе до выполнения подпроцесса. Строки, указанные в extra_groups, будут просмотрены черезgrp.getgrnam()
и будут использованы значения вgr_gid
. Целочисленные значения будут переданы дословно. (Только POSIX)Availability: POSIX
Added in version 3.9.
Если user не является
None
, системный вызов setreuid() будет выполнен в дочернем процессе до выполнения подпроцесса. Если предоставленное значение является строкой, оно будет просмотрено черезpwd.getpwnam()
и будет использовано значение вpw_uid
. Если значение является целым числом, оно будет передано дословно. (Только для POSIX)Availability: POSIX
Added in version 3.9.
Если umask не отрицательный, то системный вызов umask() будет выполнен в дочернем процессе до выполнения подпроцесса.
Availability: POSIX
Added in version 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 открываются в текстовом режиме с указанными encoding и errors, как описано выше в Часто используемые аргументы. Аргумент universal_newlines эквивалентен text и предоставляется для обратной совместимости. По умолчанию файловые объекты открываются в двоичном режиме.
Added in version 3.6: Были добавлены кодирование и ошибки.
Added in version 3.7: text был добавлен как более удобный для чтения псевдоним для universal_newlines.
Если задано, startupinfo будет представлять собой объект
STARTUPINFO
, который передается в базовую функциюCreateProcess
.Если задано, creationflags может быть одним или несколькими из следующих флагов:
pipesize можно использовать для изменения размера трубы, когда
PIPE
используется для stdin, stdout или stderr. Размер трубы изменяется только на платформах, которые поддерживают этот параметр (на данный момент только Linux). Другие платформы будут игнорировать этот параметр.Изменено в версии 3.10: Добавлен параметр pipesize.
Объекты Popen поддерживаются в качестве менеджеров контекста с помощью оператора
with
: при выходе стандартные дескрипторы файлов закрываются, а процесс ожидает завершения.with Popen(["ifconfig"], stdout=PIPE) as proc: log.write(proc.stdout.read())
Поднимает auditing event
subprocess.Popen
с аргументамиexecutable
,args
,cwd
,env
.Изменено в версии 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
только в том случае, если выбранная оболочка не была найдена. Чтобы определить, не удалось ли оболочке найти запрашиваемое приложение, необходимо проверить код возврата или вывод подпроцесса.
Если Popen
вызывается с недопустимыми аргументами, то будет выдана ошибка ValueError
.
check_call()
и check_output()
будут поднимать CalledProcessError
, если вызываемый процесс вернет ненулевой код возврата.
Все функции и методы, принимающие параметр timeout, такие как run()
и Popen.communicate()
, будут поднимать сообщение TimeoutExpired
, если таймаут истечет до завершения процесса.
Все исключения, определенные в этом модуле, наследуют от SubprocessError
.
Added in version 3.3: Был добавлен базовый класс SubprocessError
.
Соображения безопасности¶
В отличие от некоторых других функций popen, эта библиотека не будет неявно выбирать вызов системной оболочки. Это означает, что все символы, включая метасимволы оболочки, могут быть безопасно переданы дочерним процессам. Если оболочка вызывается явно, через shell=True
, приложение обязано убедиться, что все пробельные символы и метасимволы заключены в соответствующие кавычки, чтобы избежать уязвимостей shell injection. При использовании some platforms можно использовать shlex.quote()
для такой экранировки.
В Windows пакетные файлы (*.bat
или *.cmd
) могут запускаться операционной системой в системной оболочке независимо от аргументов, переданных этой библиотеке. Это может привести к тому, что аргументы будут разобраны в соответствии с правилами оболочки, но без какого-либо экранирования, добавленного Python. Если вы намеренно запускаете пакетный файл с аргументами из ненадежных источников, подумайте о передаче shell=True
, чтобы позволить Python экранировать специальные символы. Дополнительное обсуждение см. в разделе gh-114539.
Объекты Попена¶
Экземпляры класса Popen
имеют следующие методы:
- Popen.poll()¶
Проверьте, завершился ли дочерний процесс. Устанавливает и возвращает атрибут
returncode
. В противном случае возвращаетсяNone
.
- Popen.wait(timeout=None)¶
Дождитесь завершения дочернего процесса. Установите и верните атрибут
returncode
.Если процесс не завершится через timeout секунд, вызовите исключение
TimeoutExpired
. Безопасно перехватить это исключение и повторить ожидание.Примечание
Это приведет к тупику, если при использовании
stdout=PIPE
илиstderr=PIPE
дочерний процесс генерирует в трубу столько выходных данных, что блокирует ее, ожидая, пока буфер трубы ОС примет больше данных. Чтобы избежать этого, используйтеPopen.communicate()
при использовании труб.Примечание
Если параметр
timeout
не равенNone
, то (в POSIX) функция реализуется с помощью занятого цикла (неблокирующий вызов и короткий сон). Для асинхронного ожидания используйте модульasyncio
: см.asyncio.create_subprocess_exec
.Изменено в версии 3.3: Было добавлено timeout.
- Popen.communicate(input=None, timeout=None)¶
Взаимодействуйте с процессом: Отправляйте данные на stdin. Считывать данные из stdout и stderr, пока не будет достигнут конец файла. Дождаться завершения процесса и установить атрибут
returncode
. Необязательным аргументом input должны быть данные, которые нужно отправить дочернему процессу, илиNone
, если данные не нужно отправлять дочернему процессу. Если потоки были открыты в текстовом режиме, input должен быть строкой. В противном случае это должны быть байты.communicate()
возвращает кортеж(stdout_data, stderr_data)
. Данные будут строками, если потоки были открыты в текстовом режиме; в противном случае - байтами.Обратите внимание, что если вы хотите отправить данные на stdin процесса, вам нужно создать объект 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)¶
Посылает сигнал сигнал ребенку.
Ничего не делать, если процесс завершен.
Примечание
В Windows SIGTERM - это псевдоним для
terminate()
. CTRL_C_EVENT и CTRL_BREAK_EVENT могут быть отправлены процессам, запущенным с параметром creationflags, включающимCREATE_NEW_PROCESS_GROUP
.
- Popen.terminate()¶
Остановить ребенка. В POSIX ОС метод посылает
SIGTERM
ребенку. В Windows для остановки ребенка вызывается функция Win32 APITerminateProcess()
.
- Popen.kill()¶
Убивает ребенка. В POSIX ОС функция посылает SIGKILL ребенку. В Windows
kill()
является псевдонимом дляterminate()
.
Следующие атрибуты также задаются классом для доступа. Переназначение их на новые значения не поддерживается:
- Popen.args¶
Аргумент args в том виде, в котором он был передан в
Popen
. – последовательность аргументов программы или одна строка.Added in version 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¶
Код возврата дочернего процесса. Изначально
None
,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)¶
Для создания
Popen
используется частичная поддержка структуры Windows STARTUPINFO. Следующие атрибуты можно установить, передав их в качестве аргументов, содержащих только ключевое слово.Изменено в версии 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.Поддерживаемые атрибуты:
- список_ручек
Последовательность хэндлов, которые будут наследоваться. close_fds должно быть true, если оно непустое.
Ручки должны быть временно сделаны наследуемыми
os.set_handle_inheritable()
при передаче в конструкторPopen
, иначеOSError
будет вызвана ошибка WindowsERROR_INVALID_PARAMETER
(87).Предупреждение
В многопоточном процессе следует соблюдать осторожность, чтобы избежать утечки хэндлов, помеченных как наследуемые, при сочетании этой функции с одновременными вызовами других функций создания процесса, которые наследуют все хэндлы, например
os.system()
. Это также относится к стандартному перенаправлению хэндлов, которое временно создает наследуемые хэндлы.
Added in version 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.STARTF_FORCEONFEEDBACK¶
Параметр
STARTUPINFO.dwFlags
, указывающий, что во время запуска процесса будет отображаться курсор мыши Working in Background. Это поведение по умолчанию для процессов с графическим интерфейсом.Added in version 3.13.
- subprocess.STARTF_FORCEOFFFEEDBACK¶
Параметр
STARTUPINFO.dwFlags
, указывающий, что курсор мыши не будет изменяться при запуске процесса.Added in version 3.13.
- subprocess.CREATE_NEW_CONSOLE¶
Новый процесс имеет новую консоль, а не наследует консоль своего родителя (по умолчанию).
- subprocess.CREATE_NEW_PROCESS_GROUP¶
A
Popen
Параметрcreationflags
, указывающий, что будет создана новая группа процессов. Этот флаг необходим для использованияos.kill()
на подпроцессе.Этот флаг игнорируется, если указан
CREATE_NEW_CONSOLE
.
- subprocess.ABOVE_NORMAL_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь приоритет выше среднего.Added in version 3.7.
- subprocess.BELOW_NORMAL_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь приоритет ниже среднего.Added in version 3.7.
- subprocess.HIGH_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь высокий приоритет.Added in version 3.7.
- subprocess.IDLE_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь холостой (наименьший) приоритет.Added in version 3.7.
- subprocess.NORMAL_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь нормальный приоритет. (по умолчанию)Added in version 3.7.
- subprocess.REALTIME_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь приоритет реального времени. Практически никогда не следует использовать REALTIME_PRIORITY_CLASS, поскольку это прерывает системные потоки, управляющие вводом данных с мыши, клавиатуры и фоновой очисткой диска. Этот класс может подойти для приложений, которые «разговаривают» непосредственно с оборудованием или выполняют короткие задачи, которые должны иметь ограниченное количество прерываний.Added in version 3.7.
- subprocess.CREATE_NO_WINDOW¶
A
Popen
creationflags
параметр, указывающий, что новый процесс не будет создавать окно.Added in version 3.7.
- subprocess.DETACHED_PROCESS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс не будет наследовать консоль своего родителя. Это значение нельзя использовать с CREATE_NEW_CONSOLE.Added in version 3.7.
- subprocess.CREATE_DEFAULT_ERROR_MODE¶
A
Popen
creationflags
параметр, указывающий, что новый процесс не наследует режим ошибок вызывающего процесса. Вместо этого новый процесс получает режим ошибок по умолчанию. Эта возможность особенно полезна для многопоточных приложений оболочки, которые работают с отключенными жесткими ошибками.Added in version 3.7.
Старый высокоуровневый API¶
До Python 3.5 эти три функции составляли API высокого уровня для подпроцесса. Теперь вы можете использовать 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.12: Изменен порядок поиска в оболочке 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.12: Изменен порядок поиска в оболочке 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()
. - большинство аргументов передаются непосредственно в этот интерфейс. Существует одно отклонение от поведенияrun()
в API: при передаче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'
Added in version 3.1.
Изменено в версии 3.3: Было добавлено timeout.
Изменено в версии 3.4: Добавлена поддержка ключевого слова-аргумента input.
Изменено в версии 3.6: Были добавлены кодирование и ошибки. Подробности см. в
run()
.Added in version 3.7: text был добавлен как более удобный для чтения псевдоним для universal_newlines.
Изменено в версии 3.12: Изменен порядок поиска в оболочке 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()
¶
Обработка кода возврата происходит следующим образом:
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")
Функции вызова Legacy Shell¶
Этот модуль также предоставляет следующие функции, унаследованные от модуля 2.x commands
. Эти операции неявно вызывают системную оболочку, и ни одна из гарантий, описанных выше относительно безопасности и согласованности обработки исключений, не действует для этих функций.
- subprocess.getstatusoutput(cmd, *, encoding=None, errors=None)¶
Возврат
(exitcode, output)
при выполнении команды cmd в оболочке.Выполните строку cmd в оболочке с
Popen.check_output()
и верните 2-кортеж(exitcode, output)
. Для декодирования вывода используются кодировка и ошибки; подробнее см. примечания к Часто используемые аргументы.Из вывода удаляется завершающая новая строка. Код выхода команды может быть интерпретирован как код возврата подпроцесса. Пример:
>>> 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, '')
Availability: Unix, Windows.
Изменено в версии 3.3.4: Добавлена поддержка Windows.
Теперь функция возвращает (exitcode, output), а не (status, output), как это было в Python 3.3.3 и более ранних версиях. exitcode имеет то же значение, что и
returncode
.Изменено в версии 3.11: Добавлены параметры encoding и errors.
- subprocess.getoutput(cmd, *, encoding=None, errors=None)¶
Возвращает вывод (stdout и stderr) о выполнении команды cmd в оболочке.
Аналогично
getstatusoutput()
, за исключением того, что код выхода игнорируется, а возвращаемое значение представляет собой строку, содержащую вывод команды. Пример:>>> subprocess.getoutput('ls /bin/ls') '/bin/ls'
Availability: Unix, Windows.
Изменено в версии 3.3.4: Добавлена поддержка Windows
Изменено в версии 3.11: Добавлены параметры encoding и errors.
Примечания¶
Преобразование последовательности аргументов в строку в Windows¶
В Windows последовательность args преобразуется в строку, которая может быть разобрана с помощью следующих правил (которые соответствуют правилам, используемым средой выполнения MS C):
Аргументы разграничиваются пробелами, которые представляют собой либо пробел, либо табуляцию.
Строка, окруженная двойными кавычками, интерпретируется как один аргумент, независимо от наличия пробелов. Строка, заключенная в кавычки, может быть встроена в аргумент.
Двойная кавычка, перед которой стоит обратная косая черта, интерпретируется как буквальная двойная кавычка.
Обратные косые черты интерпретируются буквально, если только они не предшествуют двойной кавычке.
Если обратная косая черта непосредственно предшествует двойной кавычке, каждая пара обратных косых черточек интерпретируется как буквальная обратная косая черта. Если количество обратных слешей нечетное, то последний обратный слеш экранирует следующую двойную кавычку, как описано в правиле 3.
См.также
shlex
Модуль, предоставляющий функции для разбора и экранирования командных строк.
Запрет использования vfork()
или posix_spawn()
¶
В Linux subprocess
по умолчанию использует внутренний системный вызов vfork()
, когда это безопасно, а не fork()
. Это значительно повышает производительность.
Если вы когда-нибудь столкнетесь с предположительно очень необычной ситуацией, когда вам нужно предотвратить использование vfork()
в Python, вы можете установить атрибут subprocess._USE_VFORK
в значение false.
subprocess._USE_VFORK = False # See CPython issue gh-NNNNNN.
Установка этого атрибута не влияет на использование posix_spawn()
, который может использовать vfork()
внутри своей реализации libc. Существует аналогичный атрибут subprocess._USE_POSIX_SPAWN
, если вам нужно предотвратить его использование.
subprocess._USE_POSIX_SPAWN = False # See CPython issue gh-NNNNNN.
Можно смело устанавливать значение false для любой версии Python. Они не будут иметь никакого эффекта в старых версиях, если не поддерживаются. Не предполагайте, что атрибуты доступны для чтения. Несмотря на их названия, истинное значение не означает, что соответствующая функция будет использована, а только то, что она может быть использована.
Пожалуйста, присылайте проблемы, если вам приходится использовать эти приватные ручки, с указанием способа воспроизведения проблемы, которую вы наблюдали. Сделайте ссылку на эту проблему в комментарии к вашему коду.
Added in version 3.8: _USE_POSIX_SPAWN
Added in version 3.11: _USE_VFORK