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

我想在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库.

上一篇:Linux中录制并回放终端会话


下一篇:unittest框架下的HTMLTestRunner报告模块使用及优化