1

我需要通过运行它们并验证输出来测试一些程序,并将整个测试数据复制到报告中。通过整个测试数据,我的意思是程序的输出(stdout)和程序的输入(stdin)都需要在报告中。例如,假设我运行 python 进行一些计算。一个简单的会话可能如下所示:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> math.sqrt(2)
1.4142135623730951
>>> math.log(2)
0.6931471805599453
>>> 2 ** 32
4294967296
>>> 

在这里,我有我的输入和输出(我的计算的提示和结果)。

我的问题是,给定一个程序,可能还有一个包含该程序标准输入的文件,我怎样才能获得程序运行的所有文本数据,就好像我以交互方式运行它一样,就像上面的 python 会话一样?换句话说,在给定 python 程序和包含以下内容的文本文件(用于输入)的情况下,如何从 python 会话中获取上述文本:

import math
math.sqrt(2)
math.log(2)
2 ** 32

我可以在 shell 中运行程序并复制输出,但这似乎不是一种干净、系统的方式。相反,我正在考虑编写另一个程序,它将给定程序作为参数以及文件名(从中读取输入)。第二个程序将从给定文件中读取,派生给定程序,将文本从文件转发到给定程序(通过管道),并读取给定程序的输出(也通过管道)。这样,这个中间程序可以读取输入和输出,并将它们写入另一个文件。

我预见的唯一问题是,由于流缓冲区以及其他原因,最终输出文件中输入和输出的放置将被关闭,我将无法获得预期的输出。那么,我的逻辑是否正确,如果是,我能否以我想要的方式获得输出?有没有更简单的方法来做到这一点,例如,已经存在这样的程序?

抱歉,解释太长了。感谢您的回复。

4

2 回答 2

2

试试脚本命令。默认情况下它只捕获输出,但它也可以捕获输入。

script -akq capture.log my-fun-little-command and its args
于 2011-10-09T05:19:23.817 回答
0

您可以将管道用于基于文件的版本:

cat commands.txt|python > results.txt

否则,请查看诸如期望控制另一个程序之类的东西,例如 python shell。

于 2011-10-09T05:20:36.177 回答