最近担任助教,在老师的建议下实现一个自动判题的小软件。
题目
仿照OJ样式,规定输入和输出
输入
同学们写的python代码,无函数(有函数就可以直接调用了),无main,代码中有input()函数需要键盘输入
输出
输出到控制台(或者cmd),需要读取控制台的输出判断代码是否正确
习题样例
给定数字a和数字b,要求输出a,b的和
代码demo:test_add.py
a=float(input('first:'))
b=float(input('second:'))
print(a+b)
判题环境
Ubuntu 20.04
判题代码简易示例
work1_test1_auto_judge.py
import subprocess
res=subprocess.Popen("python3 test_add.py",shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,text=True)
(out,err)=res.communicate("1\n2")
print(out)
if "3.0" in out:
print("result is true!")
高亮显示
import subprocess
import os
import re
from fnmatch import fnmatch, fnmatchcase
print("work1 judge:")
print("--------------------------------------------")
testcase=["1\n2","100\n1000","-1\n3","4\n-3","100\n100","500\n100"]
answer=["3","495550","ERROR","ERROR","ERROR","ERROR"]
for i in range(0,len(testcase)):
res=subprocess.Popen("python3 w1.py",shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,text=True)
(out,err)=res.communicate(testcase[i])
print(out)
if answer[i] in out:
print("\033[1;32;43m case "+str(i)+" is true \033[0m") #高亮显示,具体的值可以查表
else:
print("\033[1;31;44m case "+str(i)+" is wrong and need to check again!\033[0m")
#os.killpg(os.getpgid(res.pid), 9)
主要实现思路就是,使用subprocess的Popen以脚本的方式执行同学们的习题文件,通过stdin重定向,输入测试用例和数据,最后将控制台的输出结果返回到out中,并与标准结果进行比较。