Вы не можете отправить один и тот же трубопровод в два разных процесса. Или, скорее, если вы это сделаете, они получат доступ к одному и тому же трубу, что означает, что если один процесс что-то читает, он больше не доступен для другого.
Что вам нужно сделать, это «tee» данные в некотором роде.
Если вам не нужно, чтобы поток данных, как они приходят, вы можете прочитать все выходные данные из p1
, а затем отправить его в качестве входных данных как p2
и p3
. Это очень просто:
output = check_output(cmd1)
p2 = Popen(cmd2, stdin=PIPE)
p2.communicate(output)
p3 = Popen(cmd3, stdin=PIPE)
p3.communicate(output)
Если вам просто нужно p2
и p3
работать параллельно, вы можете просто запустить их каждый в потоке.
Но если вам действительно нужна потоковая передача в реальном времени, вам нужно подключить все более тщательно. Если вы можете быть уверены, что p2
и p3
всегда будут потреблять их вход, без блокировки, то быстрее, чем p1
может предоставить его, вы можете сделать это без потоков (только цикл на p1.stdout.read()
), но в противном случае вам потребуется выходной поток для каждого потребительский процесс и Queue
или каким-либо другим способом передачи данных. См. source code - communicate
, чтобы узнать больше о том, как синхронизировать отдельные потоки.
Спасибо большое, он работал с check_output. – fuchini