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