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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值