由于在做c++信奥教学,出于某种考虑,可能会用到本地的OJ练习系统。略作修改也可以成为测试系统。用Python开发是比较简单的,不像网络的OJ平台,本地OJ不用考虑太复杂的用户情况,只需处理好最基本的几个问题即可,下面简单介绍一下。
一、源代码编译
源代码编译,是通过直接调用MinGW64实现的。
def makeExe(cpp):
command= r'MinGW64\bin\g++.exe %s -o %s -m32'
# command= r'gcc\bin\g++.exe %s -o %s -m32'
exe= filetool.changeExt(cpp, '.exe')
command= p1+ "\\"+ command%(cpp, exe)
# print(command)
cmd= command.split()
# print(cmd)
sp = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate()
ret= ""
if out:
ret+= out.decode("utf-8")
if err:
ret+= err.decode("gbk")
ret= ret.strip()
return ret
二、运行EXE,给与输入并得到结果
# 测试exe文件的执行,并用对应的测试文件.in/.out进行测试
def testExe(exe, din, dout):
cmd=[exe]
f1= open(din)
txtin= filetool.readText(din)
f2= filetool.readText(dout).rstrip()
try:
sp = subprocess.Popen(cmd, shell=True, stdin= f1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate(timeout=2)
if err:
ret= err.decode("gbk")
return 2, ret
except Exception as e:
sp.kill()
str1= "cmd /c taskkill /f /im src.exe"
subprocess.Popen(str1)
ret="------ 输入 ------\n"+txtin
ret+= "\n------标准输出------\n"+f2
ret+= "\n------用户输出------\n超时!"
return 1, ret
ret= ""
out= out.decode("gbk").rstrip()
s1= out.split('\n')
s2= f2.split('\n')
a1= len(s1)
a2= len(s2)
same= True
if a1!= a2:
same= False
else:
for i in range(a1):
l1= s1[i].rstrip()
l2= s2[i].rstrip()
if l1!=l2:
same= False
break
if same:
return 0, ""
else:
ret="------ 输入 ------\n"+txtin
ret+= "\n------标准输出------\n"+f2
ret+= "\n------用户输出------\n"+out
return 3, ret
三、界面的管理
界面尽量简单明确即可
系统提供多个题单,每个题单包含多道题目,每个题目包括内容描述,代码,当前状态等参数。
核心逻辑简述如上,有兴趣的朋友可以直接下载完整的源代码和辅助文件(CSDN下载,锁定5分)。