Мне нужно протестировать некоторые программы, запустив их и проверив выходные данные, и все данные теста должны быть скопированы в отчет.Под всеми данными теста я подразумеваю как вывод (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
>>>
Здесь у меня есть свои входы и выходы (подсказки и результаты моих расчетов).
Мой вопрос, учитывая программу ивозможно, файл, содержащий stdin для этой программы, как я могу получить все текстовые данные о запуске программы, как если бы я запускал ее в интерактивном режиме, как в предыдущем сеансе python?Другими словами, как я могу получить вышеуказанный текст из сеанса Python, учитывая программу Python и текстовый файл (для ввода), содержащий:
import math
math.sqrt(2)
math.log(2)
2 ** 32
Я мог бы запустить программу в оболочке и скопировать вывод, но это не похоже на чистый, систематический способ сделать это.Вместо этого я думаю написать другую программу, которая принимает данную программу в качестве аргумента, а также имя файла (из которого можно прочитать ввод).Эта вторая программа считывает данные из указанного файла, разветвляет указанную программу, пересылает текст из файла в указанную программу (посредством канала) и считывает вывод данной программы (также посредством канала).Таким образом, эта посредническая программа может читать как входные, так и выходные данные и записывать их в другой файл.
Единственная проблема, которую я предвижу, состоит в том, что из-за потоковых буферов, а что нет, размещение входов и выходовв конечном выходном файле будет отключен, и я не получу предполагаемый вывод.Итак, правильна ли моя логика, и если да, смогу ли я получить результат так, как хочу?Есть ли более простой способ сделать это, например, уже существует программа, которая делает это?
Извините за длинное объяснение.Спасибо за ваши ответы.