5

我有一个运行标准输入和标准输出的交互式程序。我需要创建将 X 发送到它的标准输入的包装器,检查它是否打印 Y,然后将包装器的标准输入和标准输出重定向到程序的标准输入和标准输出,就像程序将直接执行一样。

如何实施?X 和 Y 可以硬编码。重击?Python?

编辑:我无法运行该程序两次。它必须是一个实例。这是伪代码:

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是为自动化其他程序的运行而设计的——本质上你可以用纯文本编写类似的东西,

启动这个程序。当它打印出“用户名”这个词时,将我的用户名发送给它。当它发送“密码”时,将我的密码发送给它。

它非常适合驱动其他程序。

于 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

如果您只调用一次程序,Expect 比动态重新分配标准文件 I/O 更简单。

于 2009-12-11T20:56:57.393 回答
0

您可以覆盖 sys 模块的标准输入和标准输出

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

这些需要分别是为读取和写入而打开的文件对象。原始标准输入和标准输出位于

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

我对您要达到的目标感到有些困惑;据我了解,您希望:

  1. 启动指定输入 X 和预期输出 Y 的包装程序。
  2. 让包装器启动目标程序,将输入 X 附加到它的标准输入,并验证它的输出与 Y 匹配。
  3. 让目标程序返回,并在验证输出后,从包装程序的同一实例重新运行它,这次使用包装程序 stdin 和 stdout。

如果是这种情况,您想要这样做:

  1. 让包装程序为目标程序的标准输入和标准输出打开管道。
  2. 叉,并关闭所述管道的适当端部。
  3. 让父进程验证输出,而子进程exec()执行目标程序。
  4. 等待子进程在标准输出关闭时终止。
  5. 将包装程序exec()放入目标程序中。
  6. 现在目标程序将正常执行。

如果这是正确的,我可以提供一个 ~30 行 C 程序,或 ~10 行 Python 程序来实现这一点。

于 2009-12-12T14:48:47.157 回答