如何在Python中使用非阻塞管道?

2 投票
2 回答
839 浏览
提问于 2025-04-16 07:32

在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行为的定义

撰写回答