Как я могу сказать, когда программа C ++ ожидает ввода? - PullRequest
3 голосов
/ 16 ноября 2010

Я пытаюсь управлять простой программой на С ++ через python. Программа работает, предлагая пользователю ввести данные. Подсказки не обязательно заканчиваются. Я хотел бы знать, есть ли способ сказать из python, что программа на 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 ++, но это не помогло)

Спасибо за любые ответы.

Ответы [ 2 ]

6 голосов
/ 16 ноября 2010

Мне неизвестна достаточно общая парадигма для определения того, что удаленный конец ожидает ввода.Я могу думать об основных путях, но также и о ситуациях, в которых они потерпят неудачу.Примеры:

  1. Чтение с неблокирующим каналом / сокетом до тех пор, пока не поступит никакой ввод: ответ может быть прерван процессом записи на диск, ожиданием ответа из базы данных и т. Д.
  2. Дождитесь, пока процесс перестанет работать: возможно, фоновый поток все еще работает.

Вам нужно знать о протоколе, используемом приложением, которым вы пытаетесь управлять.В некотором смысле, вы будете проектировать интерпретатор для этого процесса.pexpect - это набор инструментов для Python, основанный на этой идее.

3 голосов
/ 16 ноября 2010

Взгляните на pexpect .

...