如何在Python中使用非阻塞管道?
在Python中,我想创建一个子进程,并且能够读写它的标准输入输出。假设我有一个简单的C程序,它只是把输入的内容原封不动地输出。
#include <stdio.h>
int main() {
char c;
for(;;) {
scanf("%c", &c);
printf("%c", c);
}
}
在Python中,我可以使用一个叫做subprocess的模块来做到这一点。大概是这样的:
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
我找到了一个叫做 pexpect 的模块,它正好满足我的需求。
4
当你在终端上输出内容时,stdout(标准输出)是按行缓存的,也就是说每一行的内容会被暂时存储起来,直到这一行结束才会显示出来。但是如果你是通过管道输出,stdout就会完全缓存,这样你的输出就不会立刻显示出来。
如果你想让缓存里的内容立刻显示出来,可以在每次使用 printf()
之后调用 fflush(stdout);
。另外,你可以参考这个问题 ,它的情况和你的一样,只不过你的子进程是用C语言写的,还有这个问题 ,它提到了C99标准中对stdin/stdout行为的定义。