简易仿OJ自动判题——Python实现

最近担任助教,在老师的建议下实现一个自动判题的小软件。

题目

仿照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中,并与标准结果进行比较。

你可能感兴趣的:(漫漫求索)