【问题标题】:python testing strategy to develop and auto-grader开发和自动评分器的python测试策略
【发布时间】:2016-09-06 12:02:49
【问题描述】:

我有一个输入文件列表和一个预期的输出文件,我想编写一个自动评分器来完成接受 python 程序的工作,在输入文件上运行它,并将其输出与输出文件进行比较。我使用的方法是使用python的os模块使用os.system('python program.py > actual.out')运行程序,然后再次使用os.system()在输出和expected.out之间进行差异。

我目前面临的问题是从文件中读取输入,因为给出的程序是从控制台读取的。那么,我应该如何重定向文件中的输入,以便它可以被 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 命令?

要将输出从 program.py 重定向到我使用 python program.py>tem.out 的文件。我应该使用什么等价物将输入文件重定向到 progam.py 以便在我在 program.py 中使用 sys.stdin 的任何地方,它都会从传递的文件中读取? (修改 program.py 不是一个选项。)

【问题讨论】:

  • 你试过的代码在哪里?

标签: python file python-3.4 file-handling


【解决方案1】:

您可以使用 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!
?      ^^^

根据您认为合适的方式修改链接库中的其他方法/功能。如果您需要子进程的标准输入,您可能需要创建 Popen 对象并调用通信,但请先阅读文档以供将来参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-05
    • 2010-11-27
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2022-07-08
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多