subprocess — Управление дочерними процессами
Исходный код: Lib/subprocess.py
Модуль subprocess позволяет запускать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать их коды возврата. Этот модуль призван заменить несколько более старых модулей и функций:
os.system os.spawn*
Информация о том, как модуль subprocess может быть использован для замены этих модулей и функций, приведена в следующих разделах.
См. также
PEP 324 — PEP, предлагающий модуль subprocess
Доступность: не Emscripten, не WASI.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-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. Это отображение может быть str к str на любой платформе или bytes к bytes на платформах POSIX, как иos.environилиos.environb.Примеры:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output CompletedProcess(args=['ls', '-l'], returncode=0) >>> subprocess.run("exit 1", shell=True, check=True) Traceback (most recent call last): ... subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 >>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True) CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')Добавлена в версии 3.5.
Изменено в версии 3.6: Добавлены параметры encoding и errors
Изменено в версии 3.7: Добавлен параметр text, как более понятный псевдоним universal_newlines. Добавлено параметр capture_output.
Изменено в версии 3.12: Изменён порядок поиска оболочки Windows для
shell=True. Текущая директория и%PATH%заменены на%COMSPEC%и%SystemRoot%\System32\cmd.exe. В результате, размещение вредоносной программы с именемcmd.exeв текущей директории больше не работает.
-
class subprocess.CompletedProcess -
Значение, возвращаемое функцией
run(), представляющее завершившийся процесс.-
args -
Аргументы, используемые для запуска процесса. Может быть списком или строкой.
-
returncode -
Код завершения дочернего процесса. Обычно код завершения 0 указывает на успешное выполнение.
Отрицательное значение
-Nуказывает, что дочерний процесс был завершён сигналомN(только POSIX).
-
stdout -
Захваченный stdout дочернего процесса. Последовательность байтов или строка, если функция
run()была вызвана с кодировкой, ошибками или text=True.Noneесли stdout не был захвачен.Если вы запустили процесс с
stderr=subprocess.STDOUT, stdout и stderr будут объединены в этом атрибуте, иstderrбудетNone.
-
stderr -
Захваченный stderr дочернего процесса. Последовательность байтов или строка, если функция
run()была вызвана с кодировкой, ошибками или text=True.Noneесли stderr не был захвачен.
-
check_returncode() -
Если
returncodeимеет ненулевое значение, поднимется исключениеCalledProcessError.
Добавлена в версии 3.5.
-
-
subprocess.DEVNULL -
Специальное значение, которое может использоваться в качестве аргумента stdin, stdout или stderr для
Popenи указывает, что будет использоваться специальный файлos.devnull.Добавлена в версии 3.3.
-
subprocess.PIPE -
Специальное значение, которое может использоваться в качестве аргумента stdin, stdout или stderr для
Popenи указывает на открытие канала для стандартного потока. Наиболее полезно сPopen.communicate().
-
subprocess.STDOUT -
Специальное значение, которое может использоваться в качестве аргумента stderr для
Popenи указывает, что стандартная ошибка должна попадать в тот же обработчик, что и стандартный вывод.
-
exception subprocess.SubprocessError -
Базовый класс для всех других исключений из этого модуля.
Добавлена в версии 3.3.
-
exception subprocess.TimeoutExpired -
Подкласс
SubprocessError, генерируется при истечении таймаута при ожидании дочернего процесса.-
cmd -
Команда, которая была использована для запуска дочернего процесса.
-
timeout -
Таймаут в секундах.
-
output -
Выходные данные дочернего процесса, если они были получены функцией
run()илиcheck_output(). В противном случае,None. Это всегдаbytes, если были получены какие-либо выходные данные, независимо отtext=Trueпараметра. Может остатьсяNoneвместоb'', если выходные данные не были получены.
-
stdout -
Псевдоним для output, для симметрии с
stderr.
-
stderr -
Выходные данные stderr дочернего процесса, если они были получены функцией
run(). В противном случае,None. Это всегдаbytes, если были получены выходные данные stderr, независимо отtext=Trueпараметра. Может остатьсяNoneвместоb'', если выходные данные stderr не были получены.
Добавлен в версии 3.3.
Изменён в версии 3.5: Добавлены атрибуты stdout и stderr
-
-
exception subprocess.CalledProcessError -
Подкласс
SubprocessError, генерируется, когда процесс, запущенный с помощьюcheck_call(),check_output()илиrun()(сcheck=True) возвращает код ошибки, отличный от нуля.-
returncode -
Код завершения дочернего процесса. Если процесс завершился из-за сигнала, это будет отрицательное значение номера сигнала.
-
cmd -
Команда, которая была использована для запуска дочернего процесса.
-
output -
Выходные данные дочернего процесса, если они были получены функцией
run()илиcheck_output(). В противном случае,None.
-
stdout -
Псевдоним для output, для симметрии с
stderr.
-
stderr -
Выходные данные stderr дочернего процесса, если они были получены функцией
run(). В противном случае,None.
Изменён в версии 3.5: Добавлены атрибуты stdout и stderr
-
Часто используемые аргументы
Для поддержки широкого спектра случаев использования конструктор Popen (и функции-обёртки) принимает большое количество необязательных аргументов. Для большинства типичных случаев использования многие из этих аргументов можно безболезненно оставить со значениями по умолчанию. Аргументы, которые чаще всего необходимы, это:
args требуется для всех вызовов и должен быть строкой или последовательностью аргументов программы. Предоставление последовательности аргументов обычно предпочтительнее, так как это позволяет модулю позаботиться о необходимости экранирования и цитирования аргументов (например, для разрешения пробелов в именах файлов). Если передаётся строка, то либо shell должен быть True (см. ниже), либо строка должна просто содержать имя программы для выполнения без указания каких-либо аргументов.
stdin, stdout и stderr соответственно задают стандартный ввод, стандартный вывод и стандартную ошибку выполняемой программы. Допустимые значения — 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 является последовательностью. Если args является строкой, то интерпретация зависит от платформы и описана ниже. Смотрите аргументы shell и executable для дополнительных отличий от стандартного поведения. Если не указано иное, рекомендуется передавать args как последовательность.
Предупреждение
Для максимальной надежности используйте полный путь к исполняемому файлу. Чтобы искать неопределённое имя на
PATH, используйтеshutil.which(). На всех платформах рекомендуется использоватьsys.executableдля повторного запуска текущего интерпретатора Python, а также использовать формат командной строки-mдля запуска установленного модуля.Определение пути к executable (или первому элементу args) зависит от платформы. Для POSIX см.
os.execvpe(), и обратите внимание, что при определении или поиске пути к исполняемому файлу cwd перезаписывает текущую рабочую директорию, а env может перезаписать переменную окруженияPATH. Для Windows см. документацию параметровlpApplicationNameиlpCommandLineWinAPICreateProcess, и обратите внимание, что при определении или поиске пути к исполняемому файлу сshell=False, cwd не перезаписывает текущую рабочую директорию, а env не может перезаписать переменную окруженияPATH. Использование полного пути устраняет все эти вариации.Пример передачи некоторых аргументов внешней программе как последовательности:
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
В POSIX, если args является строкой, то строка интерпретируется как имя или путь к выполняемой программе. Однако это можно сделать только если не передавать аргументы программе.
Примечание
Может быть не очевидно, как разбить командную строку на последовательность аргументов, особенно в сложных случаях.
shlex.split()может проиллюстрировать, как определить правильную токенизацию для args:>>> import shlex, subprocess >>> command_line = input() /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'" >>> args = shlex.split(command_line) >>> print(args) ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"] >>> p = subprocess.Popen(args) # Success!
Обратите особое внимание на то, что опции (например, -input) и аргументы (например, eggs.txt), разделенные пробелами в командной строке, попадают в отдельные элементы списка, а аргументы, которые требуют кавычек или экранирования обратной косой чертой при использовании в командной строке (например, имена файлов, содержащие пробелы или команда echo, показанная выше), являются отдельными элементами списка.
В Windows, если args является последовательностью, она будет преобразована в строку способом, описанным в Преобразование последовательности аргументов в строку в Windows. Это происходит потому, что подлежащая функция
CreateProcess()работает со строками.Изменено в версии 3.6: Параметр args принимает объект, подобный пути, если shell равно
Falseи последовательность, содержащую объекты, подобные путям, в POSIX.Изменено в версии 3.8: Параметр args принимает объект, подобный пути, если shell равно
Falseи последовательность, содержащую байты и объекты, подобные путям, в Windows.Аргумент shell (по умолчанию
False) указывает, использовать ли оболочку как программу для выполнения. Если shell равноTrue, рекомендуется передавать args как строку, а не как последовательность.В POSIX с
shell=True, оболочка по умолчанию/bin/sh. Если args является строкой, то строка определяет команду для выполнения через оболочку. Это означает, что строка должна быть отформатирована точно так же, как она вводилась бы в командной строке. Это включает, например, кавычки или экранирование обратной косой чертой имён файлов с пробелами в них. Если args является последовательностью, то первый элемент определяет строку команды, а все дополнительные элементы будут рассматриваться как дополнительные аргументы самой оболочке. То есть,Popenделает эквивалент:Popen(['/bin/sh', '-c', args[0], args[1], ...])
В Windows с
shell=True, переменная окруженияCOMSPECопределяет оболочку по умолчанию. Единственный случай, когда вам нужно указатьshell=Trueв Windows, это когда команда, которую вы хотите выполнить, является встроенной командой оболочки (например, dir или copy). Вам не нужно использоватьshell=Trueдля запуска пакетного файла или исполняемого файла консоли.Примечание
Перед использованием
shell=Trueпрочитайте раздел Рекомендации по безопасности.bufsize будет передан как соответствующий аргумент функции
open()при создании объектов файлов stdin/stdout/stderr:-
0означает небуферизованный (чтение и запись выполняются одной системной вызовом и могут возвращать короткие результаты) -
1означает буферизованный по строкам (используется только, еслиtext=Trueилиuniversal_newlines=True) - любое другое положительное значение означает использование буфера приблизительно такого размера
- отрицательное значение bufsize (по умолчанию) означает использование системного значения по умолчанию io.DEFAULT_BUFFER_SIZE.
Изменено в версии 3.3.1: bufsize теперь по умолчанию равен -1, чтобы включить буферизацию по умолчанию, что соответствует ожидаемому поведению большинства кода. В версиях до Python 3.2.4 и 3.3.1 оно неправильно по умолчанию было
0, что было небуферизованным и допускало короткие чтения. Это было непреднамеренно и не соответствовало поведению Python 2, как ожидалось большинством кода.Аргумент executable указывает заменяемую программу для выполнения. Это очень редко необходимо. Когда
shell=False, executable заменяет программу для выполнения, заданную args. Однако исходные args всё ещё передаются программе. Большинство программ рассматривает программу, заданную args, как имя команды, которое может отличаться от фактически исполняемой программы. В POSIX имя args становится отображаемым именем исполняемого файла в таких утилитах, как ps. Еслиshell=True, в POSIX аргумент executable указывает заменяемую оболочку для значения по умолчанию/bin/sh.Изменено в версии 3.6: Параметр executable принимает объект, подобный пути в POSIX.
Изменено в версии 3.8: Параметр executable принимает байты и объект, подобный пути в Windows.
Изменено в версии 3.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 может быть строкой, объектом типа bytes или объектом пути. В 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, он должен быть отображением, определяющим переменные среды для нового процесса; они используются вместо стандартного поведения наследования переменных среды текущего процесса. Это отображение может быть от str к str на любой платформе или от bytes к bytes на POSIX-платформах, аналогичноos.environилиos.environb.Примечание
Если указано, env должен предоставить все переменные, необходимые для выполнения программы. В Windows, для запуска side-by-side assembly указанное env должно содержать корректную
SystemRoot.Если указаны encoding или errors, или text имеет значение True, объекты файлов stdin, stdout и stderr открываются в текстовом режиме со специфицированным encoding и errors, как описано выше в Часто используемые аргументы. Аргумент universal_newlines эквивалентен text и предоставляется для обратной совместимости. По умолчанию объекты файлов открываются в бинарном режиме.
Добавлен в версии 3.6: Добавлены encoding и errors.
Добавлен в версии 3.7: Добавлен text как более читаемый псевдоним для universal_newlines.
Если указано, startupinfo будет объектом
STARTUPINFO, который передается в функциюCreateProcess.Если указано, creationflags может содержать один или несколько следующих флагов:
CREATE_NEW_CONSOLECREATE_NEW_PROCESS_GROUPABOVE_NORMAL_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASSIDLE_PRIORITY_CLASSNORMAL_PRIORITY_CLASSREALTIME_PRIORITY_CLASSCREATE_NO_WINDOWDETACHED_PROCESSCREATE_DEFAULT_ERROR_MODECREATE_BREAKAWAY_FROM_JOB
pipesize можно использовать для изменения размера канала при использовании
PIPEдля stdin, stdout или stderr. Размер канала изменяется только на платформах, поддерживающих эту функцию (на данный момент только Linux). Другие платформы игнорируют этот параметр.Изменено в версии 3.10: Добавлен параметр pipesize.
Объекты Popen поддерживаются в качестве менеджеров контекста с помощью оператора
with: при выходе стандартные файловые дескрипторы закрываются, а процесс ожидает завершения.with Popen(["ifconfig"], stdout=PIPE) as proc: log.write(proc.stdout.read())Объекты Popen и другие функции в этом модуле, использующие их, генерируют событие аудита
subprocess.Popenсо значениямиexecutable,args,cwd, иenv. Значение дляargsможет быть одиночной строкой или списком строк, в зависимости от платформы.Изменено в версии 3.2: Добавлена поддержка менеджеров контекста.
Изменено в версии 3.6: Деструктор Popen теперь генерирует предупреждение
ResourceWarning, если дочерний процесс всё ещё выполняется.Изменено в версии 3.8: Popen может использовать
os.posix_spawn()в некоторых случаях для повышения производительности. В Windows Subsystem for Linux и QEMU User Emulation конструктор Popen, использующийos.posix_spawn(), больше не генерирует исключение при ошибках, таких как отсутствие программы, но дочерний процесс завершается с ненулевым кодом возвратаreturncode.
Исключения
Исключения, генерируемые в дочернем процессе до запуска новой программы, будут перехвачены в родительском процессе.
Наиболее распространенное исключение — OSError. Оно возникает, например, при попытке выполнения несуществующего файла. Приложения должны быть готовы к исключениям OSError. Обратите внимание, что, когда shell=True, исключение OSError будет сгенерировано дочерним процессом только в случае, если сам выбранный интерпретатор оболочки не найден. Для определения того, удалось ли оболочке найти запрашиваемое приложение, необходимо проверить код возврата или вывод из дочернего процесса.
Исключение ValueError будет сгенерировано, если функция Popen вызвана с недопустимыми аргументами.
check_call() и check_output() генерируют CalledProcessError, если вызываемый процесс возвращает ненулевой код возврата.
Все функции и методы, принимающие параметр timeout, такие как run() и Popen.communicate(), генерируют TimeoutExpired, если таймаут истекает до завершения процесса.
Все исключения, определённые в этом модуле, наследуются от SubprocessError.
Добавлен в версии 3.3: Базовый класс SubprocessError.
Рекомендации по безопасности
В отличие от некоторых других функций popen, эта библиотека не будет неявно вызывать системную оболочку. Это означает, что все символы, включая метасимволы оболочки, могут безопасно передаваться дочерним процессам. Если оболочка вызывается явно с помощью shell=True, ответственность за правильную обработку пробелов и метасимволов для предотвращения уязвимостей типа «инъекция оболочки» ложится на приложение. На некоторых платформах для этой эскапирования можно использовать shlex.quote().
В Windows пакетные файлы (*.bat или *.cmd) могут запускаться операционной системой в системной оболочке независимо от аргументов, переданных в эту библиотеку. Это может привести к тому, что аргументы будут обработаны по правилам оболочки без дополнительных экранирований со стороны Python. Если вы намеренно запускаете пакетный файл с аргументами из ненадежных источников, рассмотрите возможность передачи shell=True для экранирования специальных символов. Дополнительные обсуждения см. в 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 -
Идентификатор процесса (PID) дочернего процесса.
Обратите внимание, что если вы задали аргумент shell в
True, это PID запущенной оболочки.
-
Popen.returncode -
Код возврата дочернего процесса. Изначально
None,returncodeустанавливается вызовом методовpoll(),wait()илиcommunicate(), если они обнаруживают завершение процесса.Значение
Noneуказывает, что процесс ещё не завершился на момент последнего вызова метода.Отрицательное значение
-Nуказывает, что дочерний процесс был завершен сигналомN(только POSIX).
Справочные данные по Windows Popen
Класс STARTUPINFO и следующие константы доступны только в Windows.
-
class subprocess.STARTUPINFO(*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None) -
Частичная поддержка структуры Windows STARTUPINFO используется для создания
Popen. Следующие атрибуты можно задать, передав их в качестве ключевых аргументов.Изменено в версии 3.7: Добавлена поддержка ключевых аргументов.
-
dwFlags -
Поле битовой маски, определяющее, используются ли определённые атрибуты
STARTUPINFOпри создании окна процесса.si = subprocess.STARTUPINFO() si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
-
hStdInput -
Если
dwFlagsуказывает наSTARTF_USESTDHANDLES, этот атрибут — дескриптор стандартного ввода для процесса. ЕслиSTARTF_USESTDHANDLESне указан, по умолчанию используется буфер клавиатуры.
-
hStdOutput -
Если
dwFlagsуказывает наSTARTF_USESTDHANDLES, этот атрибут — дескриптор стандартного вывода для процесса. В противном случае этот атрибут игнорируется, и по умолчанию используется буфер окна консоли.
-
hStdError -
Если
dwFlagsуказывает наSTARTF_USESTDHANDLES, этот атрибут — дескриптор стандартного потока ошибок для процесса. В противном случае этот атрибут игнорируется, и по умолчанию используется буфер окна консоли.
-
wShowWindow -
Если
dwFlagsуказывает наSTARTF_USESHOWWINDOW, этот атрибут может принимать любое значение, которое может быть задано в параметреnCmdShowдля функции ShowWindow, за исключениемSW_SHOWDEFAULT. В противном случае этот атрибут игнорируется.SW_HIDEпредоставляется для этого атрибута. Он используется, когдаPopenвызывается сshell=True.
-
lpAttributeList -
Словарь дополнительных атрибутов для создания процесса, как указано в
STARTUPINFOEX, см. UpdateProcThreadAttribute.Поддерживаемые атрибуты:
- handle_list
-
Последовательность дескрипторов, которые будут унаследованы. close_fds должно быть true, если список не пуст.
Дескрипторы должны быть временно сделаны наследуемыми с помощью
os.set_handle_inheritable()при передаче в конструкторPopen, иначе будет возбуждено исключениеOSErrorс кодом ошибки WindowsERROR_INVALID_PARAMETER(87).Предупреждение
В многопоточном процессе будьте осторожны, чтобы не протекали дескрипторы, помеченные как наследуемые, при сочетании этой функции с одновременными вызовами других функций создания процессов, которые наследуют все дескрипторы, такие как
os.system(). Это также относится к перенаправлению стандартных дескрипторов, при котором временно создаются наследуемые дескрипторы.
Добавлен в версии 3.7.
-
Константы Windows
Модуль subprocess предоставляет следующие константы.
-
subprocess.STD_INPUT_HANDLE -
Устройство стандартного ввода. Изначально это буфер ввода консоли,
CONIN$.
-
subprocess.STD_OUTPUT_HANDLE -
Устройство стандартного вывода. Изначально это активный буфер экрана консоли,
CONOUT$.
-
subprocess.STD_ERROR_HANDLE -
Устройство стандартной ошибки. Изначально это активный буфер экрана консоли,
CONOUT$.
-
subprocess.SW_HIDE -
Скрывает окно. Будет активировано другое окно.
-
subprocess.STARTF_USESTDHANDLES -
Указывает, что атрибуты
STARTUPINFO.hStdInput,STARTUPINFO.hStdOutputиSTARTUPINFO.hStdErrorсодержат дополнительную информацию.
-
subprocess.STARTF_USESHOWWINDOW -
Указывает, что атрибут
STARTUPINFO.wShowWindowсодержит дополнительную информацию.
-
subprocess.CREATE_NEW_CONSOLE -
Новый процесс получает новую консоль, вместо наследования консоли родительского процесса (по умолчанию).
-
subprocess.CREATE_NEW_PROCESS_GROUP -
Параметр
Popenдля указания на создание новой группы процессов. Этот флаг необходим для использованияos.kill()для подпроцесса.Этот флаг игнорируется, если указан флаг
CREATE_NEW_CONSOLE.
-
subprocess.ABOVE_NORMAL_PRIORITY_CLASS -
Параметр
Popenдля указания на то, что новый процесс будет иметь приоритет выше среднего.Добавлена в версии 3.7.
-
subprocess.BELOW_NORMAL_PRIORITY_CLASS -
Параметр
Popenдля указания на то, что новый процесс будет иметь приоритет ниже среднего.Добавлена в версии 3.7.
-
subprocess.HIGH_PRIORITY_CLASS -
Параметр
Popenдля указания на то, что новый процесс будет иметь высокий приоритет.Добавлена в версии 3.7.
-
subprocess.IDLE_PRIORITY_CLASS -
Параметр
Popenдля указания на то, что новый процесс будет иметь низкий приоритет (максимально низкий).Добавлена в версии 3.7.
-
subprocess.NORMAL_PRIORITY_CLASS -
Параметр
Popenдля указания на то, что новый процесс будет иметь нормальный приоритет (по умолчанию).Добавлена в версии 3.7.
-
subprocess.REALTIME_PRIORITY_CLASS -
Параметр
Popenдля указания на то, что новый процесс будет иметь приоритет реального времени. Практически никогда не следует использовать REALTIME_PRIORITY_CLASS, так как это может прервать системные потоки, управляющие вводом с мыши, клавиатуры и кешированием данных на диске. Этот класс может быть уместен для приложений, которые “общаются” напрямую с оборудованием или выполняют кратковременные задачи, которые должны иметь ограниченные прерывания.Добавлена в версии 3.7.
-
subprocess.CREATE_NO_WINDOW -
Параметр
Popenдля указания на то, что новый процесс не будет создавать окно.Добавлена в версии 3.7.
-
subprocess.DETACHED_PROCESS -
Параметр
Popenдля указания на то, что новый процесс не будет наследовать консоль родительского процесса. Это значение нельзя использовать вместе с CREATE_NEW_CONSOLE.Добавлена в версии 3.7.
-
subprocess.CREATE_DEFAULT_ERROR_MODE -
Параметр
Popenдля указания на то, что новый процесс не наследует режим ошибок вызывающего процесса. Вместо этого новый процесс получает режим ошибки по умолчанию. Эта функция особенно полезна для многопоточных оболочек, которые выполняются с отключенными критическими ошибками.Добавлена в версии 3.7.
-
subprocess.CREATE_BREAKAWAY_FROM_JOB -
Параметр
Popenдля указания на то, что новый процесс не связан с задачей.Добавлена в версии 3.7.
Старые высокоуровневые API
До Python 3.5 эти три функции составляли высокоуровневый API для subprocess. Теперь вы можете использовать run() во многих случаях, но много существующего кода использует эти функции.
-
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs) -
Выполняет команду, описанную в args. Ожидает завершения команды, а затем возвращает атрибут
returncode.Код, которому необходимо захватить stdout или stderr, должен использовать
run()вместо этого:run(...).returncode
Для подавления stdout или stderr передайте значение
DEVNULL.Показанные выше аргументы — лишь некоторые из распространенных. Полная сигнатура функции такая же, как у конструктора
Popen— эта функция передает все предоставленные аргументы, кроме timeout, непосредственно в этот интерфейс.Примечание
Не используйте
stdout=PIPEилиstderr=PIPEс этой функцией. Дочерний процесс заблокируется, если он сгенерирует достаточно вывода в канал, чтобы заполнить буфер канала ОС, поскольку каналы не читаются.Изменено в версии 3.3: Добавлен timeout.
Изменено в версии 3.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 по умолчанию закрывает все дескрипторы файлов, но вы должны указать
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). 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.
Примечания
Преобразование последовательности аргументов в строку в Windows
В Windows последовательность args преобразуется в строку, которую можно анализировать по следующим правилам (которые соответствуют правилам, используемым MS C runtime):
- Аргументы разделяются пробелами, которые представляют собой либо пробел, либо табуляцию.
- Строка, заключённая в двойные кавычки, интерпретируется как один аргумент, независимо от пробелов внутри неё. Цитата может быть вложена в аргумент.
- Двойная кавычка, предваряемая обратной косой чертой, интерпретируется как буквальная двойная кавычка.
- Обратные косые черты интерпретируются буквально, если они не предваряют двойную кавычку.
- Если обратные косые черты предшествуют двойной кавычке, каждая пара обратных косых черт интерпретируется как буквальная обратная косая черта. Если количество обратных косых черт нечётно, последняя обратная косая черта экранирует следующую двойную кавычку, как описано в правиле 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/subprocess.html