Подпроцесс Python: как получить стандартный вывод
Итак, я пишу скрипт Python, в котором мне нужно вызвать другой скрипт Python, который печатает несколько строк в стандартном выводе. Я хочу сохранить выходные данные сценария вызываемого абонента в списке и обработать их в основном сценарии.
Один простой способ - распечатать результат в файл (file3) и прочитать файл, например так:
subprocess.call("./vecdiff.py file1 file2 > file3")
f = open("file3", "r")
Как я могу перенаправить вывод непосредственно в некоторые списки в моем основном скрипте?
4 ответа
Как показано ниже, перенаправьте stdout и stderr вашего дочернего процесса в PIPE, затем вы можете использовать метод 'connect ()' для получения stdout и stderr вашего дочернего процесса из PIPE. "ТРУБА" - это канал между родительским процессом и дочерним процессом.
from subprocess import Popen, PIPE
p = Popen("./vecdiff.py file1 file2", stdout=PIPE, stderr=PIPE)
output, errput = p.communicate()
Самый простой способ - позвонить subprocess.check_output
который вызывает процесс и возвращает его вывод (или вызывает исключение для ненулевого кода возврата, но вы все равно можете получить доступ к выводу через объект исключения). Это может легко иметь дело как с STDOUT
а также STDERR
(только STDOUT
хотя по умолчанию).
Пример из руководства:
>>> subprocess.check_output(["echo", "Hello World!"])
'Hello World!\n'
Если ваш процесс генерирует много данных, и вы хотите обрабатывать их во время работы, вам придется открыть канал и использовать communicate
как описано в других ответах.
Если вы используете subprocess.Popen()
, вы можете сохранить вывод с communicate()
, Например:
proc = subprocess.Popen("./vecdiff.py file1 file2", stdout=subprocess.PIPE)
output = proc.communicate()
Легко делается с помощью свинца:
from plumbum.cmd import python
cmd = python['./vecdiff.py']['file1', 'file2']
for line in cmd().splitlines():
print line