【发布时间】:2014-05-29 06:36:43
【问题描述】:
在python子进程模块中,如果我们想运行shell命令
foo | grep bar
在 python 中,我们可以使用
p1 = Popen(["foo"], stdout = PIPE)
p2 = Popen(["grep", "bar"], stdin = p1.stdout, stdout = PIPE)
p1.stdout.close()
output = p2.communicate()[0]
我对@987654323@ 这条线感到困惑。如果你能原谅我,我会追查我认为该程序是如何工作的,希望错误会自己暴露出来。
在我看来,当output = p2.communicate()[0] 行由python 制定时,python 尝试调用p2,它认识到它需要来自p1 的输出。所以它调用p1,它执行foo并将输出扔到堆栈上,以便p2可以完成执行。然后p2 完成。
但在此跟踪中,p1.stdout.close() 并没有真正发生。那么实际发生了什么?在我看来,这种行的顺序可能也很重要,因此以下内容不起作用:
p1 = Popen(["foo"], stdout = PIPE)
p1.stdout.close()
p2 = Popen(["grep", "bar"], stdin = p1.stdout, stdout = PIPE)
output = p2.communicate()[0]
这就是我的理解状态。
【问题讨论】:
标签: python subprocess pipe