Мне нужно связать консольную программу 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(). Почему он заканчивает программу без ввода? как его исправить?
Для каждого процесса может быть не более одного вызова communicate()
, так как communicate()
ожидает завершения дочернего процесса. Чтобы многократно читать и писать из/в стандартные потоки процессов, используйте атрибуты stdout
и stdin
класса Popen
.
read(10)
ждет, пока он не встретит EOF или не прочитает 10 байтов. У меня мало опыта с этим, но вы должны использовать select
или фоновые потоки для опроса и чтения из потоков. Также имеется предупреждение о взаимоблокировках в документации subprocess
.