Подпроцесс 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
Другие вопросы по тегам