Я пытаюсь использовать модуль 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")
Итак, как мне построчно читать мой подпроцесс из итератора, а построчно читать из его стандартного вывода?