2010-11-16 42 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工具集。