subprocess — Управление подпроцессами
Исходный код: Lib/subprocess.py
Модуль subprocess позволяет запускать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать коды возврата. Этот модуль предназначен для замены нескольких устаревших модулей и функций:
os.system os.spawn*
Информация о том, как можно использовать модуль subprocess для замены этих модулей и функций, приведена в следующих разделах.
См. также
PEP 324 — PEP с предложением добавить модуль subprocess
Доступность: недоступен на Android, iOS и WASI.
Этот модуль не поддерживается на мобильных платформах и платформах WebAssembly.
Использование модуля 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.Параметр timeout можно указать в секундах; он передаётся методу
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. Это отображение может содержать строки в качестве ключей и значений на любой платформе или байты в качестве ключей и значений на POSIX-платформах, подобноos.environилиos.environb.Примеры:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output CompletedProcess(args=['ls', '-l'], returncode=0) >>> subprocess.run("exit 1", shell=True, check=True) Traceback (most recent call last): ... subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 >>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True) CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')Добавлено в версии 3.5.
Изменено в версии 3.6: Добавлены параметры encoding и errors
Изменено в версии 3.7: Добавлен параметр text — более понятный псевдоним universal_newlines. Добавлен параметр capture_output.
Изменено в версии 3.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()вызвана с параметром encoding, errors или text=True.None, если stdout не перехватывался.Если вы запустили процесс с параметром
stderr=subprocess.STDOUT, stdout и stderr будут объединены в этом атрибуте, аstderrбудет иметь значениеNone.
-
stderr -
Перехваченный stderr дочернего процесса. Последовательность байтов или строка, если
run()вызвана с параметром encoding, errors или text=True.None, если stderr не перехватывался.
-
check_returncode() -
Если
returncodeне равен нулю, вызывает исключениеCalledProcessError.
Добавлено в версии 3.5.
-
-
subprocess.DEVNULL -
Специальное значение, которое можно использовать в качестве аргумента stdin, stdout или stderr для
Popen; оно указывает, что будет использоваться специальный файлos.devnull.Добавлено в версии 3.3.
-
subprocess.PIPE -
Специальное значение, которое можно использовать в качестве аргумента stdin, stdout или stderr для
Popen; оно указывает, что для стандартного потока должен быть открыт канал. Особенно полезно в сочетании сPopen.communicate().
-
subprocess.STDOUT -
Специальное значение, которое можно использовать в качестве аргумента stderr для
Popen; оно указывает, что стандартный поток ошибок должен использовать тот же дескриптор, что и стандартный поток вывода.
-
exception subprocess.SubprocessError -
Базовый класс для всех остальных исключений этого модуля.
Добавлено в версии 3.3.
-
exception subprocess.TimeoutExpired -
Подкласс
SubprocessError, вызываемый при истечении времени ожидания дочернего процесса.-
cmd -
Команда, использованная для запуска дочернего процесса.
-
timeout -
Время ожидания в секундах.
-
output -
Вывод дочернего процесса, если он был перехвачен функцией
run()илиcheck_output(). В противном случае —None. Если какой-либо вывод был перехвачен, это значение всегда имеет типbytes, независимо от настройкиtext=True. Если вывод не был получен, значение может остатьсяNone, а неb''.
-
stdout -
Псевдоним output, обеспечивающий симметрию с
stderr.
-
stderr -
Вывод stderr дочернего процесса, если он был перехвачен функцией
run(). В противном случае —None. Если вывод stderr был перехвачен, это значение всегда имеет типbytes, независимо от настройкиtext=True. Если вывод stderr не был получен, значение может остатьсяNone, а неb''.
Добавлено в версии 3.3.
Изменено в версии 3.5: Добавлены атрибуты stdout и stderr
-
-
exception subprocess.CalledProcessError -
Подкласс
SubprocessError, вызываемый, когда процесс, запущенный функциейcheck_call(),check_output()илиrun()(с параметромcheck=True), завершается с ненулевым кодом выхода.-
returncode -
Код завершения дочернего процесса. Если процесс завершился из-за сигнала, здесь будет указано отрицательное значение номера сигнала.
-
cmd -
Команда, использованная для запуска дочернего процесса.
-
output -
Вывод дочернего процесса, если он был перехвачен функцией
run()илиcheck_output(). В противном случае —None.
-
stdout -
Псевдоним output, обеспечивающий симметрию с
stderr.
-
stderr -
Вывод stderr дочернего процесса, если он был перехвачен функцией
run(). В противном случае —None.
Изменено в версии 3.5: Добавлены атрибуты stdout и stderr
-
Часто используемые аргументы
Чтобы поддерживать самые разные сценарии использования, конструктор Popen (а также функции-обёртки) принимает большое количество необязательных аргументов. В большинстве типичных случаев многие из этих аргументов можно безопасно оставить со значениями по умолчанию. Чаще всего нужны следующие аргументы:
args обязателен во всех вызовах и должен быть строкой или последовательностью аргументов программы. Обычно предпочтительнее передавать последовательность аргументов, поскольку это позволяет модулю самостоятельно выполнять необходимое экранирование и заключение аргументов в кавычки (например, чтобы разрешить пробелы в именах файлов). Если передаётся одна строка, параметр shell должен иметь значение True (см. ниже), либо строка должна просто указывать имя запускаемой программы без аргументов.
Аргументы stdin, stdout и stderr задают дескрипторы файлов стандартного ввода, стандартного вывода и стандартного потока ошибок запускаемой программы соответственно. Допустимые значения: None, PIPE, DEVNULL, существующий файловый дескриптор (положительное целое число) и существующий файловый объект с допустимым файловым дескриптором. При стандартных настройках 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 главным образом ради более гибкого управления потоком выполнения по сравнению с большинством системных оболочек, но при этом хотите иметь удобный доступ к другим возможностям оболочки, таким как каналы, подстановочные знаки в именах файлов, раскрытие переменных среды и раскрытие ~ в домашний каталог пользователя. Однако Python сам предоставляет реализации многих возможностей, обычно связанных с оболочками (в частности, glob, fnmatch, os.walk(), os.path.expandvars(), os.path.expanduser() и shutil).
Изменено в версии 3.3: Если universal_newlines имеет значение True, класс использует кодировку locale.getpreferredencoding(False) вместо locale.getpreferredencoding(). Дополнительные сведения об этом изменении см. в документации класса io.TextIOWrapper.
Примечание
Перед использованием shell=True ознакомьтесь с разделом Рекомендации по безопасности.
Эти и все остальные параметры подробнее описаны в документации конструктора Popen.
Конструктор Popen
Создание и управление процессами в этом модуле выполняется классом Popen. Он предоставляет широкие возможности, позволяя разработчикам обрабатывать менее распространённые случаи, не охваченные вспомогательными функциями.
-
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=-1, encoding=None, errors=None, text=None, pipesize=-1, process_group=None) -
Выполняет дочернюю программу в новом процессе. В POSIX этот класс использует поведение, подобное
os.execvpe(), для выполнения дочерней программы. В Windows класс использует функцию WindowsCreateProcess(). АргументыPopenследующие.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=Falsecwd не переопределяет текущий рабочий каталог, а env не может переопределить переменную окруженияPATH. Полный путь позволяет избежать всех этих различий.Пример передачи внешней программе нескольких аргументов в виде последовательности:
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
В POSIX, если args — строка, она интерпретируется как имя или путь программы для выполнения. Однако это возможно только в том случае, если программе не передаются аргументы.
Примечание
Разбить команду оболочки на последовательность аргументов может быть непросто, особенно в сложных случаях.
shlex.split()поможет определить правильное разбиение на токены для args:>>> import shlex, subprocess >>> command_line = input() /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'" >>> args = shlex.split(command_line) >>> print(args) ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"] >>> p = subprocess.Popen(args) # Success!
Обратите особое внимание: параметры (например, -input) и аргументы (например, eggs.txt), разделённые пробелами в оболочке, должны быть отдельными элементами списка, а аргументы, для которых при использовании в оболочке требуются кавычки или экранирование обратной косой чертой (например, имена файлов с пробелами или показанная выше команда echo), должны быть одним элементом списка.
В Windows, если args — последовательность, она будет преобразована в строку способом, описанным в разделе Преобразование последовательности аргументов в строку в Windows. Это связано с тем, что базовая
CreateProcess()работает со строками.Изменено в версии 3.6: Параметр args принимает объект, подобный пути, если shell имеет значение
False, и последовательность, содержащую объекты, подобные пути, в POSIX.Изменено в версии 3.8: Параметр args принимает объект, подобный пути, если shell имеет значение
False, и последовательность, содержащую байты и объекты, подобные пути, в Windows.Аргумент shell (по умолчанию имеет значение
False) определяет, следует ли использовать оболочку в качестве выполняемой программы. Если shell имеет значениеTrue, рекомендуется передавать args строкой, а не последовательностью.В POSIX с
shell=Trueоболочкой по умолчанию является/bin/sh. Если args — строка, она задаёт команду, выполняемую через оболочку. Это значит, что строка должна быть отформатирована точно так же, как при вводе в приглашении оболочки. Например, имена файлов с пробелами необходимо заключать в кавычки или экранировать обратной косой чертой. Если args — последовательность, первый элемент задаёт строку команды, а все последующие элементы трактуются как дополнительные аргументы самой оболочки. Иными словами,Popenвыполняет эквивалент следующего:Popen(['/bin/sh', '-c', args[0], args[1], ...])
В Windows с
shell=Trueпеременная окруженияCOMSPECуказывает оболочку по умолчанию. Указыватьshell=Trueв Windows нужно только тогда, когда требуемая команда встроена в оболочку (например, dir или copy). Для запуска пакетного файла или консольного исполняемого файла указыватьshell=Trueне требуется.Примечание
Перед использованием
shell=Trueознакомьтесь с разделом Рекомендации по безопасности.bufsize будет передан в качестве соответствующего аргумента функции
open()при создании файловых объектов каналов stdin/stdout/stderr:-
0означает отсутствие буферизации (чтение и запись выполняются одним системным вызовом, который может вернуть меньше данных, чем запрошено) -
1означает буферизацию построчно (допустимо только приtext=Trueилиuniversal_newlines=True) - любое другое положительное значение означает использование буфера приблизительно такого размера
- отрицательное значение bufsize (по умолчанию) означает использование системного размера буфера io.DEFAULT_BUFFER_SIZE.
Изменено в версии 3.3.1: Теперь значение bufsize по умолчанию равно -1, чтобы включить буферизацию и обеспечить ожидаемое поведение большинства программ. В версиях до Python 3.2.4 и 3.3.1 по ошибке использовалось значение
0, которое отключало буферизацию и допускало короткие чтения. Это было непреднамеренно и не соответствовало поведению Python 2, которого ожидало большинство программ.Аргумент executable задаёт заменяющую программу для выполнения. Он нужен крайне редко. Если указано
shell=False, executable заменяет программу, заданную для выполнения аргументом args. Однако исходный args по-прежнему передаётся программе. Большинство программ воспринимают программу, указанную в args, как имя команды, которое может отличаться от фактически выполняемой программы. В POSIX имя из args становится отображаемым именем исполняемого файла в таких утилитах, как ps. Если указаноshell=True, в POSIX аргумент executable задаёт оболочку, заменяющую оболочку по умолчанию/bin/sh.Изменено в версии 3.6: Параметр executable принимает объект, подобный пути в POSIX.
Изменено в версии 3.8: Параметр executable принимает объект bytes и объект, подобный пути в Windows.
Изменено в версии 3.12: Изменён порядок поиска оболочки в Windows для
shell=True. Текущий каталог и%PATH%заменяются на%COMSPEC%и%SystemRoot%\System32\cmd.exe. В результате размещение вредоносной программы с именемcmd.exeв текущем каталоге больше не работает.stdin, stdout и stderr задают файловые дескрипторы стандартного ввода, стандартного вывода и стандартного потока ошибок выполняемой программы соответственно. Допустимые значения:
None,PIPE,DEVNULL, существующий файловый дескриптор (положительное целое число) и существующий файловый объект с действительным файловым дескриптором. При настройках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 может быть строкой, байтами или объектом, подобным пути. В POSIX функция ищет executable (или первый элемент args) относительно cwd, если путь к исполняемому файлу относительный.Изменено в версии 3.6: Параметр cwd принимает объект, подобный пути в POSIX.
Изменено в версии 3.7: Параметр cwd принимает объект, подобный пути в Windows.
Изменено в версии 3.8: Параметр cwd принимает объект bytes в Windows.
Если restore_signals имеет значение true (по умолчанию), все сигналы, для которых Python установил SIG_IGN, восстанавливаются до SIG_DFL в дочернем процессе перед вызовом exec. В настоящее время это сигналы SIGPIPE, SIGXFZ и SIGXFSZ. (Только POSIX)
Изменено в версии 3.2: Добавлен параметр restore_signals.
Если start_new_session имеет значение true, системный вызов
setsid()будет выполнен в дочернем процессе до запуска подпроцесса.Доступность: POSIX
Изменено в версии 3.2: Добавлен параметр start_new_session.
Если process_group — неотрицательное целое число, системный вызов
setpgid(0, value)будет выполнен в дочернем процессе до запуска подпроцесса.Доступность: POSIX
Изменено в версии 3.11: Добавлен параметр process_group.
Если group не равен
None, системный вызов setregid() будет выполнен в дочернем процессе до запуска подпроцесса. Если задано строковое значение, оно будет найдено с помощьюgrp.getgrnam(), а затем будет использовано значение изgr_gid. Целочисленное значение передаётся без изменений. (Только POSIX)Доступность: POSIX
Добавлено в версии 3.9.
Если extra_groups не равен
None, системный вызов setgroups() будет выполнен в дочернем процессе до запуска подпроцесса. Строки, переданные в extra_groups, будут найдены с помощьюgrp.getgrnam(), после чего будут использованы значения изgr_gid. Целочисленные значения передаются без изменений. (Только POSIX)Доступность: POSIX
Добавлено в версии 3.9.
Если user не равен
None, системный вызов setreuid() будет выполнен в дочернем процессе до запуска подпроцесса. Если задано строковое значение, оно будет найдено с помощьюpwd.getpwnam(), а затем будет использовано значение изpw_uid. Целочисленное значение передаётся без изменений. (Только POSIX)Доступность: POSIX
Добавлено в версии 3.9.
Если значение umask неотрицательное, системный вызов umask() будет выполнен в дочернем процессе до запуска подпроцесса.
Доступность: POSIX
Добавлено в версии 3.9.
Если env не равен
None, это должно быть отображение, задающее переменные окружения для нового процесса; они используются вместо поведения по умолчанию, при котором наследуется окружение текущего процесса. На любой платформе это отображение может связывать строки со строками, а на платформах POSIX — байты с байтами, подобноos.environилиos.environb.Примечание
Если параметр env указан, он должен содержать все переменные, необходимые для запуска программы. В Windows для запуска сборки Side-by-Side указанное значение env должно содержать действительный
SystemRoot.Если указаны encoding или errors либо text имеет значение true, файловые объекты stdin, stdout и stderr открываются в текстовом режиме с указанными значениями encoding и errors, как описано выше в разделе Часто используемые аргументы. Аргумент universal_newlines эквивалентен text и предоставлен для обратной совместимости. По умолчанию файловые объекты открываются в двоичном режиме.
Добавлено в версии 3.6: Добавлены параметры encoding и errors.
Добавлено в версии 3.7: Добавлен text — более понятное альтернативное имя для universal_newlines.
Если задан, startupinfo будет объектом
STARTUPINFO, который передаётся базовой функцииCreateProcess.Если задан, creationflags может содержать один или несколько следующих флагов:
CREATE_NEW_CONSOLECREATE_NEW_PROCESS_GROUPABOVE_NORMAL_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASSIDLE_PRIORITY_CLASSNORMAL_PRIORITY_CLASSREALTIME_PRIORITY_CLASSCREATE_NO_WINDOWDETACHED_PROCESSCREATE_DEFAULT_ERROR_MODECREATE_BREAKAWAY_FROM_JOB
Параметр pipesize позволяет изменить размер канала, если для stdin, stdout или stderr используется
PIPE. Размер канала изменяется только на платформах, поддерживающих эту возможность (на момент написания — только Linux). На других платформах этот параметр игнорируется.Изменено в версии 3.10: Добавлен параметр pipesize.
Объекты Popen поддерживают использование в качестве менеджеров контекста с помощью оператора
with: при выходе из контекста стандартные файловые дескрипторы закрываются, а выполнение процесса ожидается.with Popen(["ifconfig"], stdout=PIPE) as proc: log.write(proc.stdout.read())Popen и другие функции этого модуля, использующие его, вызывают событие аудита
subprocess.Popenс аргументамиexecutable,args,cwdиenv. Значениеargsможет быть одной строкой или списком строк в зависимости от платформы.Изменено в версии 3.2: Добавлена поддержка менеджеров контекста.
Изменено в версии 3.6: Деструктор Popen теперь выдаёт предупреждение
ResourceWarning, если дочерний процесс всё ещё выполняется.Изменено в версии 3.8: В некоторых случаях Popen может использовать
os.posix_spawn()для повышения производительности. В Windows Subsystem for Linux и эмуляции пользовательского режима QEMU конструктор Popen, использующийos.posix_spawn(), при таких ошибках, как отсутствие программы, больше не вызывает исключение; вместо этого дочерний процесс завершается с ненулевым значениемreturncode. -
Исключения
Исключения, возникающие в дочернем процессе до начала выполнения новой программы, будут повторно вызваны в родительском процессе.
Наиболее часто возникает исключение OSError. Например, оно возникает при попытке выполнить несуществующий файл. Приложения должны предусматривать обработку исключений OSError. Обратите внимание: при shell=True исключение OSError будет вызвано дочерним процессом только в том случае, если выбранная оболочка не найдена. Чтобы определить, не удалось ли оболочке найти запрошенное приложение, необходимо проверить код возврата или вывод подпроцесса.
Если Popen вызван с недопустимыми аргументами, будет вызвано исключение ValueError.
check_call() и check_output() вызовут CalledProcessError, если вызванный процесс завершится с ненулевым кодом возврата.
Все функции и методы, принимающие параметр timeout, такие как run() и Popen.communicate(), вызовут TimeoutExpired, если время ожидания истечёт до завершения процесса.
Все исключения, определённые в этом модуле, являются подклассами SubprocessError.
Добавлено в версии 3.3: Добавлен базовый класс SubprocessError.
Рекомендации по безопасности
В отличие от некоторых других функций popen, эта библиотека не выбирает неявно системную оболочку для вызова. Это означает, что все символы, включая метасимволы оболочки, можно безопасно передавать дочерним процессам. Если оболочка вызывается явно с помощью shell=True, приложение должно убедиться, что все пробелы и метасимволы экранированы надлежащим образом, чтобы избежать уязвимостей, связанных с инъекцией команд в оболочку. На некоторых платформах для экранирования можно использовать shlex.quote().
В Windows пакетные файлы (*.bat или *.cmd) могут запускаться операционной системой в системной оболочке независимо от аргументов, переданных этой библиотеке. В результате аргументы могут обрабатываться по правилам оболочки, но Python не добавит никакого экранирования. Если вы намеренно запускаете пакетный файл с аргументами из ненадёжных источников, рассмотрите возможность передачи shell=True, чтобы Python экранировал специальные символы. Дополнительное обсуждение см. в gh-114539.
Объекты Popen
Экземпляры класса 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) -
Отправляет дочернему процессу сигнал 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, этот атрибут является доступным для чтения объектом потока, возвращаемым функцией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).
Вспомогательные средства Popen для Windows
Класс 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.Поддерживаемые атрибуты:
- handle_list
-
Последовательность дескрипторов, которые будут унаследованы. Если последовательность непустая, параметр close_fds должен иметь значение true.
При передаче конструктору
Popenдескрипторы необходимо временно сделать наследуемыми с помощьюos.set_handle_inheritable(), иначе будет возбуждено исключение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.STARTF_FORCEONFEEDBACK -
Параметр
STARTUPINFO.dwFlags, указывающий, что при запуске процесса будет отображаться указатель мыши «Работа в фоновом режиме». Это поведение по умолчанию для процессов с графическим интерфейсом.Добавлено в версии 3.13.
-
subprocess.STARTF_FORCEOFFFEEDBACK -
Параметр
STARTUPINFO.dwFlags, указывающий, что при запуске процесса указатель мыши не будет изменён.Добавлено в версии 3.13.
-
subprocess.CREATE_NEW_CONSOLE -
Новый процесс получает новую консоль вместо наследования консоли родительского процесса (поведение по умолчанию).
-
subprocess.CREATE_NEW_PROCESS_GROUP -
Параметр
creationflagsдляPopen, указывающий, что будет создана новая группа процессов. Этот флаг необходим для использованияos.kill()для подпроцесса.Этот флаг игнорируется, если указан
CREATE_NEW_CONSOLE.
-
subprocess.ABOVE_NORMAL_PRIORITY_CLASS -
Параметр
creationflagsдляPopen, указывающий, что новый процесс будет иметь приоритет выше среднего.Добавлено в версии 3.7.
-
subprocess.BELOW_NORMAL_PRIORITY_CLASS -
Параметр
creationflagsдляPopen, указывающий, что новый процесс будет иметь приоритет ниже среднего.Добавлено в версии 3.7.
-
subprocess.HIGH_PRIORITY_CLASS -
Параметр
creationflagsдляPopen, указывающий, что новый процесс будет иметь высокий приоритет.Добавлено в версии 3.7.
-
subprocess.IDLE_PRIORITY_CLASS -
Параметр
creationflagsдляPopen, указывающий, что новый процесс будет иметь фоновый (самый низкий) приоритет.Добавлено в версии 3.7.
-
subprocess.NORMAL_PRIORITY_CLASS -
Параметр
creationflagsдляPopen, указывающий, что новый процесс будет иметь обычный приоритет (по умолчанию).Добавлено в версии 3.7.
-
subprocess.REALTIME_PRIORITY_CLASS -
Параметр
creationflagsдляPopen, указывающий, что новый процесс будет иметь приоритет реального времени. Почти никогда не следует использовать REALTIME_PRIORITY_CLASS, поскольку он прерывает системные потоки, отвечающие за обработку ввода с мыши и клавиатуры, а также фоновую запись данных на диск. Этот класс может подходить для приложений, напрямую взаимодействующих с оборудованием, или выполняющих кратковременные задачи, которые должны как можно реже прерываться.Добавлено в версии 3.7.
-
subprocess.CREATE_NO_WINDOW -
Параметр
creationflagsдляPopen, указывающий, что новый процесс не будет создавать окно.Добавлено в версии 3.7.
-
subprocess.DETACHED_PROCESS -
Параметр
creationflagsдляPopen, указывающий, что новый процесс не будет наследовать консоль родительского процесса. Это значение нельзя использовать вместе с CREATE_NEW_CONSOLE.Добавлено в версии 3.7.
-
subprocess.CREATE_DEFAULT_ERROR_MODE -
Параметр
creationflagsдляPopen, указывающий, что новый процесс не будет наследовать режим обработки ошибок вызывающего процесса. Вместо этого новый процесс получит режим обработки ошибок по умолчанию. Эта возможность особенно полезна для многопоточных приложений-оболочек, работающих с отключённой обработкой критических ошибок.Добавлено в версии 3.7.
-
subprocess.CREATE_BREAKAWAY_FROM_JOB -
Параметр
creationflagsдляPopen, указывающий, что новый процесс не связан с заданием.Добавлено в версии 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()— большинство аргументов передаются непосредственно этому интерфейсу. Есть одно отличие API от поведенияrun(): передачаinput=Noneбудет вести себя так же, какinput=b''(илиinput='', в зависимости от других аргументов), а не использовать дескриптор файла стандартного ввода родительского процесса.По умолчанию эта функция возвращает данные в виде закодированных байтов. Фактическая кодировка выходных данных может зависеть от вызываемой команды, поэтому декодирование в текст часто необходимо выполнять на уровне приложения.
Это поведение можно изменить, задав для text, encoding, errors или universal_newlines значение
True, как описано в разделах Часто используемые аргументы иrun().Чтобы также включить стандартный поток ошибок в результат, используйте
stderr=subprocess.STDOUT:>>> subprocess.check_output( ... "ls non_existent_file; exit 0", ... stderr=subprocess.STDOUT, ... shell=True) 'ls: non_existent_file: No such file or directory\n'
Добавлено в версии 3.1.
Изменено в версии 3.3: Добавлен параметр timeout.
Изменено в версии 3.4: Добавлена поддержка именованного аргумента input.
Изменено в версии 3.6: Добавлены encoding и errors. Подробности см. в описании
run().Добавлено в версии 3.7: Добавлен text как более понятный псевдоним для universal_newlines.
Изменено в версии 3.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(), 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 по умолчанию закрывает все файловые дескрипторы, но для гарантии такого поведения на всех платформах или в предыдущих версиях Python необходимо указать
close_fds=Trueпри вызовеPopen.
Устаревшие функции вызова оболочки
Этот модуль также предоставляет следующие устаревшие функции из модуля commands версии 2.x. Эти операции неявно вызывают системную оболочку, поэтому описанные выше гарантии безопасности и единообразной обработки исключений для них не действуют.
-
subprocess.getstatusoutput(cmd, *, encoding=None, errors=None) -
Возвращает
(exitcode, output)выполнения cmd в оболочке.Выполняет строку cmd в оболочке с
Popen.check_output()и возвращает 2-кортеж(exitcode, output). Параметры encoding и errors используются для декодирования вывода; дополнительные сведения см. в примечаниях к разделу Часто используемые аргументы.Завершающий символ новой строки удаляется из вывода. Код завершения команды можно интерпретировать как код возврата подпроцесса. Пример:
>>> 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, '')Доступность: 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'Доступность: Unix, Windows.
Изменено в версии 3.3.4: Добавлена поддержка Windows.
Изменено в версии 3.11: Добавлены параметры encoding и errors.
Примечания
Поведение при тайм-ауте
При использовании параметра timeout в таких функциях, как run(), Popen.wait() или Popen.communicate(), следует учитывать следующие особенности:
- Задержка при создании процесса: На многих платформах создание процесса нельзя прервать с помощью API. Это означает, что даже при заданном тайм-ауте исключение о превышении времени ожидания может возникнуть только после завершения создания процесса.
-
Чрезвычайно малые значения тайм-аута: Если задать очень малое значение тайм-аута (например, несколько миллисекунд), исключение
TimeoutExpiredможет возникнуть почти сразу, поскольку создание процесса и планирование задач операционной системой неизбежно требуют времени.
Преобразование последовательности аргументов в строку в Windows
В Windows последовательность args преобразуется в строку, которую можно разобрать по следующим правилам (они соответствуют правилам, используемым средой выполнения MS C):
- Аргументы разделяются пробельными символами: пробелом или табуляцией.
- Строка, заключённая в двойные кавычки, считается одним аргументом независимо от содержащихся в ней пробельных символов. Строка в кавычках может быть частью аргумента.
- Двойная кавычка, перед которой стоит обратная косая черта, интерпретируется как буквальная двойная кавычка.
- Обратные косые черты интерпретируются буквально, если только непосредственно за ними не следует двойная кавычка.
- Если непосредственно перед двойной кавычкой стоят обратные косые черты, каждая пара обратных косых черт интерпретируется как одна буквальная обратная косая черта. Если количество обратных косых черт нечётное, последняя обратная косая черта экранирует следующую двойную кавычку, как описано в правиле 3.
См. также
-
shlex -
Модуль, предоставляющий функции для разбора и экранирования командных строк.
Отключение использования vfork() или posix_spawn()
В Linux модуль subprocess по умолчанию использует системный вызов vfork(), если это безопасно, вместо fork(). Это значительно повышает производительность.
Если вы столкнулись с предположительно крайне необычной ситуацией, в которой необходимо запретить Python использовать vfork(), можно присвоить атрибуту 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. В неподдерживаемых старых версиях это ни на что не повлияет. Не следует предполагать, что атрибуты доступны для чтения. Несмотря на названия, значение True не означает, что соответствующая функция будет использоваться, а лишь указывает на такую возможность.
Всякий раз, когда вам приходится использовать эти непубличные настройки, сообщайте об ошибке и указывайте способ воспроизведения проблемы. Добавьте ссылку на это сообщение об ошибке в комментарий к своему коду.
Добавлено в версии 3.8: _USE_POSIX_SPAWN
Добавлено в версии 3.11: _USE_VFORK
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/subprocess.html