3

Python を使用して単純な C++ プログラムを制御しようとしています。このプログラムは、ユーザーに入力を求めることによって機能します。プロンプトは必ずしも endl で終了するとは限りません。私が知りたいのは、C ++プログラムが出力を生成しなくなり、入力の要求に切り替えたことをpythonから伝える方法があるかどうかです。簡単な例を次に示します。

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++側でバッファリングを試してみましたが、役に立たなかったようです)

ご回答ありがとうございます。

4

2 に答える 2

6

リモートエンドが入力を待っていることを検出するための十分に一般的なパラダイムを認識していません。基本的な方法だけでなく、失敗する状況も考えられます。例:

  1. 入力が到着しないまでノンブロッキング パイプ/ソケットで読み取ります。応答は、ディスクへの書き込みプロセス、データベースからの応答の待機などによって中断される可能性があります。
  2. プロセスがアイドル状態になるまで待ちます。バックグラウンド スレッドがまだ実行されている可能性があります。

制御しようとしているアプリケーションが使用するプロトコルを認識する必要があります。ある意味では、そのプロセスのインタープリターを設計することになります。pexpectは、この考えに基づく Python 用のツールセットです。

于 2010-11-16T19:05:52.273 に答える
3

pexpectを見てください。

于 2010-11-16T19:00:42.727 に答える