当启动顺序发生变化时,运行管道子过程会产生不同的结果吗?

时间:2010-08-27 14:09:55

标签: python-3.x subprocess pipe

我正在使用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永远挂起。对此有合理的解释吗?

1 个答案:

答案 0 :(得分:1)

看起来p2(消费者)正在悬挂,因为它的stdin仍处于打开状态。如果代码修改如下,则两个进程都成功完成:

p2 = Popen(command2, stdin=PIPE)
p1 = Popen(command1, stdout=p2.stdin)
p1.wait()
p2.stdin.close()
p2.wait()

我敢打赌,这就是“漏洞抽象法则”。