我有一个运行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()
答案 0 :(得分:3)
答案 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和stdoutsys.stdin, sys.stdout = sys.__stdin__, sys.__stdout__
答案 3 :(得分:0)
我对你究竟想要达到的目标感到有些困惑;据我所知,你希望:
如果是这种情况,你想这样做:
exec()
并执行目标程序。exec()
放入目标程序。如果这是正确的,我可以提供一个~30行C程序,或~10行Python程序来实现这个目标。