subprocess.communicate () отправляет мусор для обработки? - PullRequest
1 голос
/ 22 февраля 2012

У меня проблемы с чтением / записью в stdin / stdout в дочернем процессе с subprocess.communicate ().

Это дочерний процесс (в C)

#include <stdio.h>

int main ()
{
    char buf[128];
    printf("test\n");
    gets(buf);
    printf("%s", buf);
    return 0;
}

Это программа на python, которая вызывает эту дочернюю программу

import subprocess

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

stdin, stderr = proc.communicate()
print stdin
proc.communicate(stdin)
stdin, stderr = proc.communicate()
print stdin

print stdin

Я ожидаю, что это напечатает

test
input was test:

Однако, похоже, что proc.communicate () вызывает EOF для gets (), вызывая завершение дочернего приложения. Могу ли я в любом случае связаться с дочерним приложением, не отправляя EOF? Т.е. я хотел бы прочитать приложение, а затем написать в него.

1 Ответ

1 голос
/ 22 февраля 2012

Из документации на Popen.communicate():

Отправка данных на стандартный ввод. Читайте данные из stdout и stderr, пока не будет достигнут конец файла. Дождитесь завершения процесса.

Это означает, что вы можете вызвать communicate() только один раз для вашего подпроцесса.

Получение вывода в реальном времени может быть довольно сложным, но в вашем примере это не должно быть слишком сложным, поскольку вы пытаетесь прочитать только одну строку. Должно работать следующее:

import subprocess

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

outdata = proc.stdout.readline()
print outdata
outdata, errdata = proc.communicate('output was ' + outdata)
print outdata

Обратите внимание, что я переименовал некоторые из ваших переменных, так как вывод вашего подпроцесса на самом деле не является стандартным для вашего процесса Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...