我想在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
但python文档说:
Use
communicate()
rather than.stdin.write
,.stdout.read
or.stderr.read
to avoid deadlocks due to any of the other OS pipe
buffers filling up and blocking the child process.
那么我应该如何使用cut.stdout?有人可以解释文档吗?
解决方法:
如果您在不了解可能的缓冲问题的情况下使用process.stdin.write,则您生成的外部进程可能会永久阻塞.例如,如果进程通过向其stdout写入大量(例如,10-100MB)数据并且在未接收到此数据的情况下继续写入其stdin而响应您的1行输入,则该进程将被阻止写入stdout(stdout是一个未命名的管道,操作系统为它们维护特定大小的缓冲区).
您可以通过将输入和输出任务作为单独的线程运行来尝试处理这些问题的iterpipes库.