2010-11-16 40 views
3

我想通过python控制一个简单的C++程序。该程序通过提示用户输入来工作。提示不一定以endl结尾。我想知道的是,如果有一种方法可以告诉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。通过读取C++程序生成的输出并解析该数据,pexpect功能看起来可行。我可能最终会这样做,但我一直在寻找更通用的东西,即使您不知道C++程序将生成什么输出,也可以工作。 – 2010-11-16 19:16:24

+0

无法知道程序是否在等待输入;不幸的是,管道不提供这种功能。 – kindall 2010-11-16 19:19:17

+0

@Dave:如果进程使用'select()'来确定答案的可用性(即“主动等待”),那么在等待输入时它不会阻塞。这可能就是为什么管道首先不提供该功能的原因。 – 2010-11-16 19:23:39

6

我不知道用于检测远端正在等待输入足够一般范式。我可以想到基本的方式,但也可以想到他们会失败的情况。实例:

  1. 读取与非阻塞管/插座,直到没有输入到达:响应可能由过程写入到磁盘被中断,等待从数据库等的应答
  2. 等待直到过程变为空闲:后台线程可能仍在运行。

您必须了解您要控制的应用程序使用的协议。从某种意义上说,您将为该过程设计一个口译员pexpect是基于这个想法的Python工具集。