如何实现stdin,stdout包装器?

时间:2009-12-11 20:52:56

标签: python bash wrapper stdout stdin

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

如何实现? X和Y可以硬编码。击?蟒?

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

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 个答案:

答案 0 :(得分:3)

Expect用于自动运行其他程序 - 基本上你用纯文本写一些东西

启动此计划。当它打印出“用户名”这个词时,请将其用户名发送给我。当它发送“密码”时,请将密码发送给我。

这对推动其他计划非常有用。

答案 1 :(得分: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更简单的选择。

答案 2 :(得分:0)

您可以覆盖sys模块的stdin和stdout

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

这些需要分别是为读写而打开的文件对象。

可以找到原始的stdin和stdout
sys.stdin, sys.stdout = sys.__stdin__, sys.__stdout__

答案 3 :(得分:0)

我对你究竟想要达到的目标感到有些困惑;据我所知,你希望:

  1. 启动包装器程序,指定输入X和预期输出Y。
  2. 让包装器启动目标程序,将输入X附加到它的stdin,并验证它的输出是否与Y匹配。
  3. 让目标程序返回,并在验证输出后,从包装程序的同一个实例重新运行它,这次使用包装程序stdin和stdout。
  4. 如果是这种情况,你想这样做:

    1. 让包装器程序打开目标程序的stdin和stdout的管道。
    2. 叉,并关闭所述管道的适当末端。
    3. 让父进程验证输出,同时验证子exec()并执行目标程序。
    4. 等待子进程在stdout关闭时终止。
    5. 将包装程序exec()放入目标程序。
    6. 现在目标程序将正常执行。
    7. 如果这是正确的,我可以提供一个~30行C程序,或~10行Python程序来实现这个目标。