Я запускаю поток команд из программы на python3, используя subprocess.*
; Я не хотела
проходить через оболочку, поскольку я передаю аргументы своим подкомандам и проверяю, что оболочка не будет неверно их интерпретировать, было бы кошмаром.
В документе subprocess
приведен пример того, как это сделать:
p1 = Popen(command1, stdout=PIPE)
p2 = Popen(command2, stdin=p1.stdout)
p2.wait()
p1.wait()
Это хорошо работает. Тем не менее, я задавался вопросом, будет ли безопаснее начать потребителя до производителя, поэтому
p2 = Popen(command2, stdin=PIPE)
p1 = Popen(command1, stdout=p2.stdin)
p2.wait()
p1.wait()
Я ожидал, что это будет вести себя точно так же, но, видимо, это не так. Первый код работает без нареканий; во-вторых, моя программа зависает; Если я посмотрю на систему, то увижу, что p1 мертв и ждет, когда его пожнут, а p2 зависнет навсегда. Есть ли рациональное объяснение этому?