Чтение стандартного вывода из одной программы в другой программе - PullRequest
2 голосов
/ 18 октября 2011

У меня проблема с чтением стандартного вывода в Python.Я должен немного объяснить, что я пытаюсь сделать.

У меня есть программа на Python ( foo );это вызывает вторую программу на Python ( bar ). bar вернет детали статуса stdout и другую информацию для регистрации. foo теперь должен прочитать это.В принципе это работает.Я могу получить вывод bar и отправить его в файл журнала без каких-либо проблем.Проблемы начинаются, когда я пытаюсь найти определенные фразы в выводе bar (отчет о состоянии).

Я читаю вывод с os.read (fn, n) из стандартного вывода bar .Проблема в том, что os.read читает n байтов, но не строку;это может быть больше или меньше.Я хочу, чтобы он читал каждую строку, которая записывается в стандартный вывод bar , эти строки заканчиваются на \ n и пишутся либо с print , либо с sys.stdout.write , за которым следует sys.stdout.flush () .

foo , звонки bar с использованием:

bar= subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
fd_in[0] = bar.stdout.fileno()
fd_in[1] = bar.stderr.fileno()

Мой код выглядит следующим образом. bar пишет:

print 'TAG INFO1 INFO2 INFO3'
#or
sys.stdout.write('TAG INFO1 INFO2 INFO3\n')
sys.stdout.flush()

Я читаю в foo с

buf = os.read(fd_in[0], 256)

Когда я записываю это в файл журнала с помощью:

int_logFile.write(buf)
int_logFile.flush()

все хорошо.Но если я хочу получить первое слово строки вывода, как это:

tokens = buf.strip('\n').split(' ')

Я в конечном итоге в missery, потому что я не получаю TAG, но я мог бы иметь INFOx или что-то из предыдущего вывода ничегоделать с моими сообщениями о состоянии.

Итак, чтобы подвести итог, мне нужно прочитать строку bar построчно в foo .Есть идеи ???

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Э-э, bar.stdout.readline()? Проходить весь путь до файловых дескрипторов редко бывает необходимо.

0 голосов
/ 18 октября 2011

Как насчет Popen.communicate ? Это также позволит вам отправлять ввод в процесс, если вы хотите.

...