如何在python中使用管道而不阻塞?

时间:2010-11-24 08:02:45

标签: python pipe subprocess popen

在python中,我想创建一个子进程并读取和写入其stdio数据。 假设我有以下C程序只将其输入写入其输出。

#include <stdio.h>
int main() {
    char c;
    for(;;) {
        scanf("%c", &c);
        printf("%c", c);
    }
}

在python中,我应该可以使用子进程模块来使用它。像这样:

from subprocess import *
pipe = Popen("thing", stdin=PIPE, stdout=PIPE)
pipe.stdin.write("blah blah blah")
text = pipe.stdout.read(4) # text should == "blah"

但是在这种情况下,无限期地调用读取块。 我怎样才能做到我想要实现的目标?

2 个答案:

答案 0 :(得分:4)

stdout在写入终端时是行缓冲的,但在写入管道时完全缓冲,因此不会立即看到输出。

要刷新缓冲区,请在每个fflush(stdout);后调用printf()。另请参阅this question,除了您的子进程是用C语言编写外,它是相同的,this question引用了C99中定义的stdin / stdout行为。

答案 1 :(得分:0)

我找到了pexpect模块,它完全符合我的需要。