subprocess
— Управление подпроцессами¶
Исходный код: Lib/subprocess.py
Модуль subprocess
позволяет запускать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать их коды возврата. Этот модуль предназначен для замены нескольких старых модулей и функций:
os.system
os.spawn*
Информацию о том, как модуль subprocess
можно использовать для замены этих модулей и функций, можно найти в следующих разделах.
См.также
PEP 324 – PEP предлагает модуль подпроцесса
Availability: это не Emscripten, это был не я.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten
и wasm32-wasi
. Дополнительную информацию смотрите в разделе Платформы веб-сборки.
Использование модуля 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 и stdin равныPIPE
. Аргументы stdout и stderr могут не передаваться одновременно с capture_output. Если вы хотите захватить и объединить оба потока в один, установите для stdout значениеPIPE
, а для stderr значениеSTDOUT
, вместо использования capture_output.Тайм-аут может быть указан в секундах, он внутренне передается в
Popen.communicate()
. Если тайм-аут истечет, дочерний процесс будет остановлен и будет ждать завершения. ИсключениеTimeoutExpired
будет вызвано повторно после завершения дочернего процесса. Само создание исходного процесса не может быть прервано во многих API-интерфейсах платформы, поэтому вы не гарантированно увидите исключение тайм-аута, по крайней мере, до тех пор, пока не истечет время, необходимое для создания процесса.Аргумент 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
. Это сопоставление может быть str в str на любой платформе или байт в байт на платформах 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: Добавлены параметры кодировки и ошибок
Изменено в версии 3.7: Добавлен параметр text, как более понятный псевдоним для universal_newlines. Добавлен параметр capture_output.
Изменено в версии 3.11.3: Изменен порядок поиска в командной строке Windows для
shell=True
. Текущий каталог и%PATH%
заменены на%COMSPEC%
и%SystemRoot%\System32\cmd.exe
. В результате удаление вредоносной программы с именемcmd.exe
в текущий каталог больше не работает.
- class subprocess.CompletedProcess¶
Возвращаемое значение из
run()
, представляющее завершенный процесс.- args¶
Аргументы, используемые для запуска процесса. Это может быть список или строка.
- returncode¶
Статус завершения дочернего процесса. Как правило, статус завершения, равный 0, указывает на то, что он успешно запущен.
Отрицательное значение
-N
указывает на то, что дочерний процесс был завершен по сигналуN
(только в POSIX).
- stdout¶
Захваченный стандартный вывод из дочернего процесса. Последовательность байтов или строка, если
run()
была вызвана с кодировкой, ошибками или text=True.None
если стандартный вывод не был захвачен.Если вы запустили процесс с
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''
, если результат не наблюдался.
- 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
.
Изменено в версии 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
, если аргументом новой строки для его конструктора являетсяNone
.Если текстовый режим не используется, stdin, stdout и stderr будут открыты в виде двоичных потоков. Кодировка или преобразование окончания строки не выполняются.
Изменено в версии 3.6: Добавлены параметры encoding и errors.
Изменено в версии 3.7: Добавлен параметр text в качестве псевдонима для universal_newlines.
Примечание
Атрибут newlines объектов file
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
для получения дополнительной информации об этом изменении.Примечание
Прочтите раздел Security Considerations перед использованием
shell=True
.
Эти параметры, наряду со всеми другими параметрами, более подробно описаны в документации конструктора 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
для запуска установленного модуля.Определение пути к исполняемому файлу (или первому элементу 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
, и последовательность, содержащую объекты, подобные пути, в POSIX.Изменено в версии 3.8: параметр args принимает значение path-like object, если значение 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
для запуска пакетного файла или консольного исполняемого файла.Примечание
Прочтите раздел Security Considerations перед использованием
shell=True
.bufsize будет указан в качестве соответствующего аргумента функции
open()
при создании файловых объектов канала stdin/stdout/stderr:0
означает небуферизованный (чтение и запись являются одним системным вызовом и могут возвращать короткие значения)1
означает, что строка буферизована (используется только в том случае, еслиtext=True
илиuniversal_newlines=True
)любое другое положительное значение означает использование буфера примерно такого же размера
отрицательный размер буфера (значение по умолчанию) означает системное значение ввода-вывода по умолчанию.Будет использоваться значение 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.11.3: Изменен порядок поиска в командной строке Windows для
shell=True
. Текущий каталог и%PATH%
заменены на%COMSPEC%
и%SystemRoot%\System32\cmd.exe
. В результате удаление вредоносной программы с именемcmd.exe
в текущий каталог больше не работает.stdin, stdout и stderr определяют стандартный ввод выполняемой программы, стандартный вывод и стандартные дескрипторы файлов ошибок соответственно. Допустимыми значениями являются
PIPE
,DEVNULL
, существующий файловый дескриптор (положительное целое число), существующий file object с допустимым файловым дескриптором иNone
.PIPE
указывает, что следует создать новый канал для дочернего элемента.DEVNULL
указывает, что будет использоваться специальный файлos.devnull
. При настройках по умолчаниюNone
перенаправление не произойдет; дескрипторы дочерних файлов будут унаследованы от родительских. Кроме того, stderr может бытьSTDOUT
, что указывает на то, что данные stderr из приложений должны записываться в тот же файловый дескриптор, что и для стандартного вывода.Если для параметра 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 функция ищет исполняемый файл (или первый элемент в args) относительно cwd, если путь к исполняемому файлу является относительным.Изменено в версии 3.6: параметр cwd принимает значение path-like object в POSIX.
Изменено в версии 3.7: параметр cwd принимает значение path-like object в Windows.
Изменено в версии 3.8: параметр cwd принимает объект bytes в Windows.
Если значение restore_signals равно true (значение по умолчанию), все сигналы, для которых в Python установлено значение SIG_IGN, восстанавливаются в SIG_DFL в дочернем процессе перед запуском exec. В настоящее время это включает сигналы SIGPIPE, SIGXFSZ и SIGXFFSZ для 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
Добавлено в версии 3.9.
Если значение extra_groups не равно
None
, то системный вызов setgroups() будет выполнен в дочернем процессе до выполнения подпроцесса. Строки, указанные в extra_groups, будут найдены с помощьюgrp.getgrnam()
и будут использованы значения изgr_gid
. Целые значения будут переданы дословно. (только в POSIX)Availability: POSIX
Добавлено в версии 3.9.
Если user не является
None
, системный вызов setreuid() будет выполнен в дочернем процессе до выполнения подпроцесса. Если указанное значение является строкой, оно будет найдено с помощьюpwd.getpwnam()
и будет использовано значение изpw_uid
. Если значение является целым числом, оно будет передано дословно. (Только для POSIX)Availability: POSIX
Добавлено в версии 3.9.
Если значение umask не является отрицательным, то системный вызов umask() будет выполнен в дочернем процессе до выполнения подпроцесса.
Availability: POSIX
Добавлено в версии 3.9.
Если значение env не равно
None
, то это должно быть сопоставление, которое определяет переменные среды для нового процесса; они используются вместо поведения по умолчанию при наследовании среды текущего процесса. Это сопоставление может быть str в str на любой платформе или байт в байт на платформах 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 и предусмотрен для обеспечения обратной совместимости. По умолчанию файловые объекты открываются в двоичном режиме.
Добавлено в версии 3.6: были добавлены кодировка и ошибки.
Добавлено в версии 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: Всплывающий деструктор теперь выдает предупреждение
ResourceWarning
, если дочерний процесс все еще запущен.Изменено в версии 3.8: В некоторых случаях Popen может использовать
os.posix_spawn()
для повышения производительности. В подсистеме Windows для Linux и пользовательской эмуляции QEMU конструктор Popen с использованиемos.posix_spawn()
больше не вызывает исключения при таких ошибках, как отсутствие программы, но дочерний процесс завершается сбоем с ненулевым значениемreturncode
.
Исключения¶
Исключения, возникшие в дочернем процессе до начала выполнения новой программы, будут повторно вызваны в родительском.
Чаще всего возникает исключение OSError
. Это происходит, например, при попытке запустить несуществующий файл. Приложениям следует подготовиться к исключениям OSError
. Обратите внимание, что функция when shell=True
, OSError
будет запущена дочерним элементом только в том случае, если сама выбранная оболочка не была найдена. Чтобы определить, не удалось ли командной оболочке найти запрошенное приложение, необходимо проверить код возврата или выходные данные из подпроцесса.
Значение ValueError
будет вызвано, если Popen
вызывается с недопустимыми аргументами.
check_call()
и check_output()
вызовут CalledProcessError
, если вызванный процесс вернет ненулевой код возврата.
Все функции и методы, которые принимают параметр timeout, такой как run()
и Popen.communicate()
, вызовут TimeoutExpired
, если время ожидания истечет до завершения процесса.
Все исключения, определенные в этом модуле, наследуются от SubprocessError
.
Добавлено в версии 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
.Если процесс не завершается по истечении таймаута секунд, создается исключение
TimeoutExpired
. Можно перехватить это исключение и повторить попытку ожидания.Примечание
Это приведет к взаимоблокировке при использовании
stdout=PIPE
илиstderr=PIPE
, и дочерний процесс генерирует достаточное количество выходных данных для канала, так что он блокирует ожидание, пока буфер канала операционной системы примет больше данных. ИспользуйтеPopen.communicate()
при использовании каналов, чтобы избежать этого.Примечание
Если параметр
timeout
не равенNone
, то (в POSIX) функция реализуется с использованием цикла занятости (неблокирующий вызов и кратковременный режим ожидания). Используйте модульasyncio
для асинхронного ожидания: смотритеasyncio.create_subprocess_exec
.Изменено в версии 3.3: был добавлен тайм-аут.
- Popen.communicate(input=None, timeout=None)¶
Взаимодействуйте с процессом: отправляйте данные в stdin. Считывайте данные из stdout и stderr, пока не будет достигнут конец файла. Дождитесь завершения процесса и установите атрибут
returncode
. Необязательным аргументом input должны быть данные, которые должны быть отправлены дочернему процессу, илиNone
, если данные не должны быть отправлены дочернему процессу. Если потоки были открыты в текстовом режиме, input должен быть строкой. В противном случае это должны быть байты.communicate()
возвращает кортеж(stdout_data, stderr_data)
. Данные будут строками, если потоки были открыты в текстовом режиме; в противном случае - байтами.Обратите внимание, что если вы хотите отправить данные в стандартный идентификатор процесса, вам нужно создать объект Popen с помощью
stdin=PIPE
. Аналогично, чтобы получить что-либо отличное отNone
в результирующем кортеже, вам нужно также указатьstdout=PIPE
и/илиstderr=PIPE
.Если процесс не завершится по истечении таймаута секунд, будет вызвано исключение
TimeoutExpired
. При перехвате этого исключения и повторной попытке обмена данными выходные данные не будут потеряны.Дочерний процесс не уничтожается по истечении таймаута, поэтому для правильной очистки исправное приложение должно уничтожить дочерний процесс и завершить взаимодействие:
proc = subprocess.Popen(...) try: outs, errs = proc.communicate(timeout=15) except TimeoutExpired: proc.kill() outs, errs = proc.communicate()
Примечание
Считанные данные буферизуются в памяти, поэтому не используйте этот метод, если размер данных большой или неограниченный.
Изменено в версии 3.3: был добавлен тайм-аут.
- 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 APITerminateProcess()
.
- 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
, то этот атрибут является доступным для чтения объектом stream, который возвращается с помощьюopen()
. Чтение из потока обеспечивает вывод дочернего процесса. Если были указаны аргументы encoding или errors или аргумент text или universal_newlines был равенTrue
, то поток является текстовым потоком, в противном случае это поток байтов. Если аргумент stdout не былPIPE
, то этот атрибут равенNone
.
- Popen.stderr¶
Если аргументом stderr было
PIPE
, то этот атрибут является доступным для чтения объектом stream, который возвращается с помощью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).
Помощники по открытию окон¶
Класс 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()
. Это также относится к стандартному перенаправлению дескрипторов, которое временно создает наследуемые дескрипторы.
Добавлено в версии 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¶
A
Popen
creationflags
параметр, указывающий, что будет создана новая группа процессов. Этот флаг необходим для использованияos.kill()
в подпроцессе.Этот флаг игнорируется, если указано значение
CREATE_NEW_CONSOLE
.
- subprocess.ABOVE_NORMAL_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь приоритет выше среднего.Добавлено в версии 3.7.
- subprocess.BELOW_NORMAL_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь приоритет ниже среднего.Добавлено в версии 3.7.
- subprocess.HIGH_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь высокий приоритет.Добавлено в версии 3.7.
- subprocess.IDLE_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь самый низкий приоритет в режиме ожидания.Добавлено в версии 3.7.
- subprocess.NORMAL_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь обычный приоритет. (по умолчанию)Добавлено в версии 3.7.
- subprocess.REALTIME_PRIORITY_CLASS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс будет иметь приоритет в реальном времени. Вы почти никогда не должны использовать REALTIME_PRIORITY_CLASS, потому что это прерывает системные потоки, которые управляют вводом данных с помощью мыши, клавиатуры и фоновой очисткой диска. Этот класс может подойти для приложений, которые «общаются» напрямую с оборудованием или выполняют короткие задачи, которые должны иметь ограниченные перерывы.Добавлено в версии 3.7.
- subprocess.CREATE_NO_WINDOW¶
A
Popen
creationflags
параметр, указывающий, что новый процесс не будет создавать окно.Добавлено в версии 3.7.
- subprocess.DETACHED_PROCESS¶
A
Popen
creationflags
параметр, указывающий, что новый процесс не будет наследовать консоль своего родителя. Это значение нельзя использовать с CREATE_NEW_CONSOLE.Добавлено в версии 3.7.
- subprocess.CREATE_DEFAULT_ERROR_MODE¶
Параметр
Popen
creationflags
, указывающий, что новый процесс не наследует режим ошибки вызывающего процесса. Вместо этого новый процесс получает режим ошибки по умолчанию. Эта функция особенно полезна для многопоточных приложений оболочки, которые запускаются с отключенными жесткими ошибками.Добавлено в версии 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
.Код, которому необходимо перехватить стандартный вывод или stderr, должен использовать
run()
вместо этого:run(...).returncode
Чтобы отключить стандартный вывод или stderr, введите значение
DEVNULL
.Приведенные выше аргументы являются лишь некоторыми из наиболее распространенных. Полная сигнатура функции такая же, как и у конструктора
Popen
- эта функция передает все предоставленные аргументы, кроме timeout, непосредственно в этот интерфейс.Примечание
Не используйте
stdout=PIPE
илиstderr=PIPE
с этой функцией. Дочерний процесс будет заблокирован, если он генерирует достаточно выходных данных для канала, чтобы заполнить буфер канала операционной системы, поскольку каналы не считываются.Изменено в версии 3.3: был добавлен тайм-аут.
Изменено в версии 3.11.3: Изменен порядок поиска в командной строке 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()
не удалось запустить процесс, он распространит возникшее исключение.Код, которому необходимо перехватить стандартный вывод или stderr, должен использовать
run()
вместо этого:run(..., check=True)
Чтобы отключить стандартный вывод или stderr, введите значение
DEVNULL
.Приведенные выше аргументы являются лишь некоторыми из наиболее распространенных. Полная сигнатура функции такая же, как и у конструктора
Popen
- эта функция передает все предоставленные аргументы, кроме timeout, непосредственно в этот интерфейс.Примечание
Не используйте
stdout=PIPE
илиstderr=PIPE
с этой функцией. Дочерний процесс будет заблокирован, если он генерирует достаточно выходных данных для канала, чтобы заполнить буфер канала операционной системы, поскольку каналы не считываются.Изменено в версии 3.3: был добавлен тайм-аут.
Изменено в версии 3.11.3: Изменен порядок поиска в командной строке 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: был добавлен тайм-аут.
Изменено в версии 3.4: Была добавлена поддержка аргумента ключевого слова input.
Изменено в версии 3.6: были добавлены кодировка и ошибки. Подробности смотрите в
run()
.Добавлено в версии 3.7: text был добавлен в качестве более удобочитаемого псевдонима для universal_newlines.
Изменено в версии 3.11.3: Изменен порядок поиска в командной строке 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"])
Замена трубопровода shell¶
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.
В качестве альтернативы, для надежного ввода данных по-прежнему можно напрямую использовать собственную конвейерную поддержку shell:
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, *, 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.
Функция теперь возвращает (код завершения, выходные данные) вместо (статус, выходные данные), как это было в Python 3.3.3 и более ранних версиях. Код завершения имеет то же значение, что и
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. Если они не поддерживаются, они не будут влиять на более старые версии. Не предполагайте, что атрибуты доступны для чтения. Несмотря на их названия, истинное значение не указывает на то, что соответствующая функция будет использоваться, а только на то, что она может быть использована.
Пожалуйста, сообщайте о проблемах в любое время, когда вам нужно использовать эти личные кнопки, чтобы воспроизвести проблему, с которой вы столкнулись. Ссылка на эту проблему из комментария в вашем коде.
Добавлено в версии 3.8: _USE_POSIX_SPAWN
Добавлено в версии 3.11: _USE_VFORK