Я пытаюсь использовать модуль подпроцесса Python. Мне нужно отправить входные данные первому процессу, выходные данные которого становятся входными данными второго процесса. Ситуация в основном такая же, как в примере, приведенном в документации здесь: http://docs.python.org/library/subprocess.html#replacing-shell-pipeline за исключением того, что мне нужно ввести первую команду. Вот этот пример скопирован:
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
Если мы изменим первую строку на:
p1 = Popen(["cat"], stdout=PIPE, stdin=PIPE)
Как мне предоставить входную строку процессу? Если я попытаюсь сделать это, изменив последнюю строку на:
output = p2.communicate(input=inputstring)[0]
Это не сработает.
У меня есть рабочая версия, которая просто сохраняет вывод первой команды в строке, а затем передает ее второй команде . В этом нет ничего страшного, поскольку параллелизм, который можно было бы использовать, по существу отсутствует (в моем реальном варианте использования первая команда завершится довольно быстро и в конце выдаст весь свой вывод). Вот полная рабочая версия:
import subprocess
simple = """Writing some text
with some lines in which the
word line occurs but others
where it does
not
"""
def run ():
catcommand = [ "cat" ]
catprocess = subprocess.Popen(catcommand,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(catout, caterr) = catprocess.communicate(input=simple)
grepcommand = [ "grep", "line" ]
grepprocess = subprocess.Popen(grepcommand,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(grepout, greperr) = grepprocess.communicate(input=catout)
print "--- output ----"
print grepout
print "--- error ----"
print greperr
if __name__ == "__main__":
run()
Надеюсь, я достаточно ясно выразился, спасибо за любую помощь.