我有一个输入文件列表和一个预期的输出文件,我想编写一个自动分级器,它接受一个python程序,在输入文件上运行它,并将其输出与输出文件进行比较。我使用的方法是使用python的os
模块使用os.system('python program.py > actual.out')
运行程序,然后使用os.system()再次在输出和expected.out之间执行diff。
我目前面临的问题是从文件中读取输入,因为给出的程序是从控制台读取的。那么,我应该如何重定向文件中的输入,使其可以被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
的文件。我应该使用什么等效的输入文件重定向到progam.py,这样无论我在program.py中使用过sys.stdin,它都将从传递的文件中读取? (修改program.py不是一个选项。)
答案 0 :(得分: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!
? ^^^
根据需要修改,链接库中的其他方法/函数。如果您需要stdin用于子进程,您可能需要创建Popen对象并调用通信,但请先阅读文档以供将来参考。