communic()和.stdin.write,.stdout.read或.stderr.read - python之间的区别

Maj*_*imi 3 python stdin stdout pipe stderr

我想在3个命令之间创建一个管道:

cat = subprocess.Popen("cat /etc/passwd", stdout=subprocess.PIPE)
grep = subprocess.Popen("grep '<usernamr>'", stdin=cat.stdout, stdout=subprocess.PIPE)
cut = subprocess.Popen("cut -f 3 -d ':'", stdin=grep.stdout, stdout=subprocess.PIPE)
for line in cut.stdout:
    # process each line here
Run Code Online (Sandbox Code Playgroud)

但python文档说:

使用communicate()而不是.stdin.write,.stdout.read.stderr.read避免由于任何其他OS管道缓冲区填满和阻止子进程而导致的死锁.

那我该怎么用cut.stdout?有人可以解释文档吗?

Fre*_*Foo 5

communicate旨在防止将不可能在你的应用程序反正发生死锁:它的存在主要是为情况都stdinstdout一个上Popen对象是管道调用进程,即

subprocess.Popen(["sometool"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以安全地阅读cut.stdout.您可以使用,communicate如果您觉得方便,但您不需要.

(注意subprocess.Popen("/etc/passwd")没有意义;你似乎忘了了cat.另外,别忘了shell=True.)