2010-11-24 3 views
2

В python я хочу создать подпроцесс и прочитать и записать данные в его stdio. Допустим, у меня есть следующая программа на C, которая просто записывает свой ввод в свой вывод.Как использовать трубы в python без блокировки?

#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" 

Однако в этом случае звонок для чтения блоков неограниченно. Как я могу сделать то, что я пытаюсь достичь?

ответ

4

stdout буферизируется по строке при записи на терминал, но полностью буферизуется при записи в трубу, поэтому ваш вывод не отображается сразу.

Чтобы сбросить буфер, позвоните по телефону fflush(stdout); после каждого printf(). См. Также this question, который является тем же, за исключением того, что ваш подпроцесс написан на C и this question, который ссылается на поведение stdin/stdout, как определено в C99.

0

Я нашел модуль pexpect, который выполняет именно то, что мне нужно.

Смежные вопросы