我正在使用subprocess.*
从python3程序运行一系列命令;我不想要
通过一个shell,因为我将参数传递给我的子命令,并确保这些不会被shell误解为噩梦。
subprocess
doc给出了如何执行此示例:
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永远挂起。对此有合理的解释吗?
答案 0 :(得分:1)
看起来p2(消费者)正在悬挂,因为它的stdin
仍处于打开状态。如果代码修改如下,则两个进程都成功完成:
p2 = Popen(command2, stdin=PIPE)
p1 = Popen(command1, stdout=p2.stdin)
p1.wait()
p2.stdin.close()
p2.wait()
我敢打赌,这就是“漏洞抽象法则”。