Я пытаюсь управлять простой программой C++ через python. Программа работает, запрашивая пользователя для ввода. Запросы не обязательно заканчиваются. Я хотел бы знать, есть ли способ из python сказать, что программа C++ больше не генерирует выходные данные и переключается на запрос ввода. Вот простой пример:Как узнать, когда программа C++ ждет ввода?
C++
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "Enter a number ";
cin >> x;
cout << x << " squared = " << x * x << endl;
}
питон:
#! /usr/bin/python
import subprocess, sys
dproc = subprocess.Popen('./y', stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while (True) :
dout = dproc.stdout.read(1)
sys.stdout.write(dout)
dproc.stdin.write("22\n")
Этот вид работ, но пишет dproc.stdin слишком много. Вместо этого я ищу способ прочитать все от dproc.stdout до программа готова для ввода, а затем записывается в dproc.stdout.
Если возможно, я хотел бы сделать это без изменения кода C++. (Тем не менее, я пробовал играть с буферизацией на стороне C++, но, похоже, это не помогло)
Благодарим за любые ответы.
Я посмотрел на pexpect. Функциональность pexpect, похоже, работает, читая результат, который генерирует и анализирует эти данные в программе C++. Я мог бы сделать это, но я искал нечто более общее, которое могло бы работать, даже если вы не знаете, какой результат будет генерировать программа C++. –
Невозможно узнать, ожидает ли программа ввода данных; К сожалению, трубы просто не обеспечивают эту функциональность. – kindall
@Dave: если процесс использует 'select()', чтобы определить доступность ответа (например, «активное ожидание»), он не будет блокироваться, ожидая ввода в любом случае. Вероятно, поэтому каналы не обеспечивают эту функциональность в первую очередь. –