5

stdin と stdout を実行する対話型プログラムがあります。Xを標準入力に送信するラッパーを作成し、Yを出力してから、プログラムが直接実行されるのと同じように、ラッパーの標準入力と標準出力をプログラムの標準入力と標準出力にリダイレクトすることを確認する必要があります。

これを実装する方法は?X と Y はハードコーディングできます。バッシュ?パイソン?

編集:プログラムを 2 回実行することはできません。1 つのインスタンスである必要があります。擬似コードは次のとおりです。

def wrap(cmd, in, expected_out):
  p = exec(cmd)
  p.writeToStdin(in)
  out = p.readBytes (expected_out.size())
  if (out != expected_out) return fail;
  # if the above 4 lines would be absent or (in == "" and out == "")
  # then this wrapper would be exactly like direct execution of cmd
  connectpipe (p.stdout, stdout)
  connectpipe (stdin, p.stdin)
  p.continueExecution() 
4

4 に答える 4

3

Expectは、他のプログラムの実行を自動化するために作られています。基本的には、次のようなものをプレーン テキストで記述します。

このプログラムを開始します。「ユーザー名」という単語が出力されたら、私のユーザー名を送ってください。「password」が送られてきたら、私のパスワードを送ってください。

他のプログラムを運転するのに本当に素晴らしいです。

于 2009-12-11T21:00:00.150 に答える
1

X と Y がファイルであり、プログラムを複数回呼び出すことができると仮定します。

#!/bin/bash

test "`program <X`" = "`cat Y`" && program

または、より詳細に失敗するには:

#!/bin/bash

if [[ `program <X` != `cat Y` ]]; then
    echo -e "Assertion that input X produces Y failed, exiting."
    exit 1
fi

program

プログラムを 1 回だけ呼び出す場合、Expect は、標準のファイル I/O をオンザフライで再割り当てするよりもはるかに簡単な代替手段です。

于 2009-12-11T20:56:57.393 に答える
0

sys モジュールの stdin と stdout を上書きできます

import sys
sys.stdin, sys.stdout = wrapper.stdin, wrapper.stdout

これらは、それぞれ読み取り用と書き込み用に開かれたファイル オブジェクトである必要があります。元の stdin と stdout は次の場所にあります。

sys.stdin, sys.stdout = sys.__stdin__, sys.__stdout__
于 2009-12-11T21:01:07.527 に答える
0

あなたが何を達成しようとしているのか、私は少し混乱しています。私が理解しているように、あなたは次のことを望んでいます:

  1. 入力 X と予期される出力 Y を指定して、ラッパー プログラムを開始します。
  2. ラッパーに、入力 X をその stdin に接続するターゲット プログラムを開始させ、その出力が Y と一致することを確認します。
  3. ターゲット プログラムを返して、出力を確認した後、今度はラッパー プログラムの stdin と stdout を使用して、ラッパー プログラムの同じインスタンスから再実行します。

これがあなたがこれをしたい場合:

  1. ラッパー プログラムで、ターゲット プログラムの stdin と stdout のパイプを開きます。
  2. 分岐し、前記パイプの適切な端を閉じます。
  3. 親プロセスで出力を検証し、子プロセスでexec()ターゲット プログラムを実行します。
  4. stdout が閉じたときに子プロセスが終了するのを待ちます。
  5. ラッパー プログラムexec()をターゲット プログラムに組み込みます。
  6. これで、ターゲット プログラムは通常どおり実行されます。

これが正しければ、これを実現する ~30 行の C プログラム、または ~10 行の Python プログラムを提供できます。

于 2009-12-12T14:48:47.157 に答える