Модуль подпроцесса Python, как мне ввести ввод для первой из серий конвейерных команд?

Я пытаюсь использовать модуль подпроцесса 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()

Надеюсь, я достаточно ясно выразился, спасибо за любую помощь.

5
задан Plan 22 February 2011 в 15:49
поделиться