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