“标准”子流程管道技术(例如http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline)可以“升级”到两个管道吗?
# How about
p1 = Popen(["cmd1"], stdout=PIPE, stderr=PIPE)
p2 = Popen(["cmd2"], stdin=p1.stdout)
p3 = Popen(["cmd3"], stdin=p1.stderr)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
p1.stderr.close()
#p2.communicate() # or p3.communicate()?
好的,这实际上是一个不同的用例,但最近的起点似乎是管道示例。顺便说一句,“正常”管道中的 p2.communicate() 如何驱动 p1?这是供参考的正常管道:
# From Python docs
output=`dmesg | grep hda`
# becomes
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
我想我最终对可以communicate()
支持哪种“过程图”(或者可能只是树?)感兴趣,但我们将把一般情况留到另一天。
更新:这是基线功能。没有communicate(),创建2个线程从p1.stdout和p2.stdout读取。在主进程中,通过 p1.stdin.write() 注入输入。问题是我们是否可以只使用communicate() 来驱动一个1-source,2-sink 图