2010-11-16 5 views
3

Я пытаюсь управлять простой программой 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++, но, похоже, это не помогло)

Благодарим за любые ответы.

ответ

3

Посмотрите на pexpect.

+0

Я посмотрел на pexpect. Функциональность pexpect, похоже, работает, читая результат, который генерирует и анализирует эти данные в программе C++. Я мог бы сделать это, но я искал нечто более общее, которое могло бы работать, даже если вы не знаете, какой результат будет генерировать программа C++. –

+0

Невозможно узнать, ожидает ли программа ввода данных; К сожалению, трубы просто не обеспечивают эту функциональность. – kindall

+0

@Dave: если процесс использует 'select()', чтобы определить доступность ответа (например, «активное ожидание»), он не будет блокироваться, ожидая ввода в любом случае. Вероятно, поэтому каналы не обеспечивают эту функциональность в первую очередь. –

6

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

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

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

Смежные вопросы