Как использовать трубы в Python без блокировки? - PullRequest
2 голосов
/ 24 ноября 2010

В 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 ]

4 голосов
/ 24 ноября 2010

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

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

0 голосов
/ 24 ноября 2010

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

...