Как я могу передать стандартный ввод подпроцесса из итератора Python?

Я пытаюсь использовать модуль subprocess в Python для связи с процессом, который читает стандартный ввод и записывает стандартный вывод в потоковом режиме. Я хочу, чтобы подпроцесс читал строки из итератора, который производит ввод, а затем считывал выходные строки из подпроцесса. Между строками ввода и вывода не может быть однозначного соответствия. Как я могу передать подпроцесс из произвольного итератора, который возвращает строки?

Вот пример кода, который дает простой тестовый пример, и некоторые методы, которые я пробовал, не работают по той или иной причине:

#!/usr/bin/python
from subprocess import *
# A really big iterator
input_iterator = ("hello %s\n" % x for x in xrange(100000000))

# I thought that stdin could be any iterable, but it actually wants a
# filehandle, so this fails with an error.
subproc = Popen("cat", stdin=input_iterator, stdout=PIPE)

# This works, but it first sends *all* the input at once, then returns
# *all* the output as a string, rather than giving me an iterator over
# the output. This uses up all my memory, because the input is several
# hundred million lines.
subproc = Popen("cat", stdin=PIPE, stdout=PIPE)
output, error = subproc.communicate("".join(input_iterator))
output_lines = output.split("\n")

Итак как я могу сделать так, чтобы мой подпроцесс считывался из итератора построчно, пока я построчно читал из его стандартного вывода?

8
задан Ryan C. Thompson 31 July 2011 в 22:05
поделиться