2016-09-06 8 views
1

필자는 입력 파일 목록과 예상 출력 파일을 가지고 있습니다. 파이썬 프로그램을 수락하고 입력 파일에서 실행하는 자동 그레이더를 작성하고 싶습니다. 출력을 출력 파일과 비교합니다. 내가 사용한 접근법은 os.system('python program.py > actual.out')을 사용하여 프로그램을 실행하기 위해 os 파이썬 모듈을 사용한 다음 os.system()을 사용하여 출력과 expected.out 사이에서 diff를 수행하는 것입니다.python 테스팅 전략 개발 및 자동 그레이팅

내가 현재 직면하고있는 문제는 주어진 프로그램이 콘솔에서 읽는 것이므로 파일에서 입력을 읽는 것입니다. 그래서, 어떻게 입력 파일을 program.py의 sys.stdin에서 읽을 수 있도록 리디렉션해야합니까?

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을 사용하십시오. program.py에서 sys.stdin을 사용하면 어디에서나 전달 된 파일을 읽을 수 있도록 입력 파일을 progam.py로 리디렉션하는 데 어떤 동등한 기능을 사용해야합니까? (program.py 수정은 옵션이 아닙니다.)

+1

시도한 코드는 어디에 있습니까? – pzp

답변

0

subprocess을 효과적으로 회전시키고 예상 출력에서 ​​diff을 수행하기 때문에 파이썬 3.3+에서 내장 모듈을 사용하여 모든 것을 수행 할 수 있습니다. 간단한 최소한의 예 : 당신이 다른 방법으로 맞는 볼

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 객체를 만들고 호출을 호출해야하지만 나중에 참조 할 수 있도록 문서를 먼저 읽어야합니다.