Модуль подпроцесса Python - неожиданное поведение

1

Мне нужно связать консольную программу C (как подпроцесс) с Python, используя stdin/stdout.

программа C больше o меньше:

    tmp = 0.0;  
    printf("\ninput>>");
    scanf_s("%f",&tmp);
    printf ("\ninput was: %f",tmp);

    tmp = 0.0;
    printf("\ninput>>");
    scanf_s("%f",&tmp);
    printf ("\ninput was: %f",tmp);

    tmp = 0.0;
    printf("\ninput>>");
    scanf_s("%f",&tmp);
    printf ("\ninput was: %f",tmp);

Используя модуль подпроцесса python, мне нужно прочитать данные из этой программы, написать что-нибудь, затем снова прочитать и так далее. Я использовал следующий код:

>>> p=subprocess.Popen(['C:\T.exe'],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
>>> o,i=communicate('123\n')

вывод o:

input>>
input was: 123.000000
input>>
input was: 0.000000
input>>
input was: 0.000000

Я ожидал, что подпроцесс будет ждать ввода до другого вызова o, я = communication(). Почему он заканчивает программу без ввода? как его исправить?

  • 0
    Это укусило меня и в прошлом. :)
Теги:
subprocess

1 ответ

3
Лучший ответ

Для каждого процесса может быть не более одного вызова communicate(), так как communicate() ожидает завершения дочернего процесса. Чтобы многократно читать и писать из/в стандартные потоки процессов, используйте атрибуты stdout и stdin класса Popen.

  • 0
    если я использую p.stdout.read (10), то оболочка python не отвечает, пока я не закрою процесс вручную. затем выводит ''. то же самое с .readline и .readlines. Что это может быть?
  • 0
    read(10) ждет, пока он не встретит EOF или не прочитает 10 байтов. У меня мало опыта с этим, но вы должны использовать select или фоновые потоки для опроса и чтения из потоков. Также имеется предупреждение о взаимоблокировках в документации subprocess .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню