Python 3.x 当启动顺序更改时,运行管道子流程会产生不同的结果?

Python 3.x 当启动顺序更改时,运行管道子流程会产生不同的结果?,python-3.x,subprocess,pipe,Python 3.x,Subprocess,Pipe,我正在使用子进程运行python3程序中的命令管道。*;我不想 通过shell,因为我正在将参数传递给我的子命令,确保这些参数不会被shell错误地解释将是噩梦 子流程文档给出了如何执行此操作的示例: p1 = Popen(command1, stdout=PIPE) p2 = Popen(command2, stdin=p1.stdout) p2.wait() p1.wait() 这很有效。然而,我想知道在生产商之前启动消费者是否更安全,所以 p2 = Popen(command2, std

我正在使用
子进程运行python3程序中的命令管道。*
;我不想 通过shell,因为我正在将参数传递给我的子命令,确保这些参数不会被shell错误地解释将是噩梦

子流程
文档给出了如何执行此操作的示例:

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则永远挂起。对此有合理的解释吗?

看起来p2(消费者)被挂起,因为它的
stdin
保持打开状态。如果这样修改代码,则两个进程都将成功完成:

p2 = Popen(command2, stdin=PIPE)
p1 = Popen(command1, stdout=p2.stdin)
p1.wait()
p2.stdin.close()
p2.wait()
我敢打赌这就是行为中的泄漏抽象法则。

它看起来像p2(消费者)被挂起,因为它的
stdin
保持打开状态。如果这样修改代码,则两个进程都将成功完成:

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

我敢打赌,这就是行为中泄漏的抽象法则。

哇,看来你是对的。但我仍然不明白为什么需要这样做。行为的差异从何而来?在子进程调用exec()之后,它们所做的事情不受父进程的控制,对吗?家长的GC会参与吗?哇,看起来你是对的。但我仍然不明白为什么需要这样做。行为的差异从何而来?在子进程调用exec()之后,它们所做的事情不受父进程的控制,对吗?家长的GC是否会参与?