2016-09-06 7 views
1

У меня есть список входных файлов и ожидаемый выходной файл, я хочу написать автогрейдер, который выполняет работу по приему программы python, запускает ее на входных файлах, и сравнивая его вывод с выходным файлом. Подход, который я использовал, состоит в том, чтобы использовать модуль python для запуска программы с использованием os.system('python program.py > actual.out'), а затем выполнить разницу между выходом и expect.out снова с помощью os.system().Стратегия тестирования python для разработки и автогрейдера

Проблема, с которой я сейчас сталкиваюсь, - это чтение ввода из файла, потому что программа, которая указана, читается с консоли. Итак, как мне перенаправить входные данные из файла таким образом, чтобы он читался sys.stdin в program.py.

import os 
def grade(program_py_file_handler,input_dir,output_dir): 
    #create temporary file for program.py using program_py_file_handler 
    #one by one read all files from input_dir 
    #run program.py using os.system generating a temp file 
    #do diff be temp file and expected file 

Есть ли лучший способ выполнить diff без использования команды diff?

Чтобы перенаправить вывод из program.py в файл, я использовал python program.py>tem.out. Какой эквивалент я должен использовать для перенаправления входного файла на progam.py, так что везде, где я использовал sys.stdin в program.py, он будет вместо этого читать из переданного файла? (Модификация program.py не является опцией.)

+1

Где код, который вы пробовали? – pzp

ответ

0

Вы можете делать все, используя встроенные модули в Python 3.3+, так как вы эффективно разворачиваете subprocess и делаете diff на ожидаемом выходе. Простой минимальный пример:

check.py

import sys 
from subprocess import check_output 
from difflib import ndiff 

def split(s): 
    return s.splitlines(keepends=True) 

def check(program_name, expected): 
    output = check_output([sys.executable, program_name]).decode('utf8') 
    diff = ndiff(split(output), split(expected)) 
    print(''.join(diff), end="") 

def main(): 
    check('hello.py', 'Good Morning!\n') 

if __name__ == '__main__': 
    main() 

hello.py

print('Good Evening!') 

Пример запуска

$ python check.py 
- Good Evening! 
?  ^^^ 
+ Good Morning! 
?  ^^^ 

Изменить, как вы считаете нужным, с другими методами/функции в библиотеках l подписан. Если вам нужен stdin для подпроцесса, вам, вероятно, понадобится создать объект Popen и вызвать связь, но сначала прочитайте документацию для дальнейшего использования.

 Смежные вопросы

  • Нет связанных вопросов^_^