用python django开发online judge时, 测评系统能不能用c++实现?这两个最后怎么连接?

2025-05-19 22:53:08
推荐回答(1个)
回答1:

Time&Memory篇
(一)思路:

先利用subprocess.Popen(),调用外部命令执行程序,将.in文件输入,将程序运行结果保存在.out文件中。程序数据输入和结果保存完成了,接下来就是时间和内存的问题。通过pid获取进程号,然后利用psutil模块实现进程的控制与监听,即可完成一个简单的Time&Memory的判断。

(二)代码:

import time
import subprocess
import psutil

dir_work = "./"
fin = open("./main.in", "r+")
fout = open("./main.out", "w+")

p_cmd = { # 运行程序的命令,这里以C++、C语言为例
"gcc": "./main",
"g++": "./main",
}

def time_mem(language):
"""
执行程序获取执行时间与内存
"""
time_limit = 1 #second 时间限制
mem_limit = 128 * 1024 #kb 内存限制
max_rss = 0 #记录最大内存
problem_info = {} #时间单位ms 内存单位kb
p = subprocess.Popen(p_cmd[language],shell=True,cwd=dir_work, stdin=fin, stdout=fout, stderr=subprocess.PIPE) # cwd设置工作目录
start = time.time() #开始时间
print("程序开始运行的时间是%s" % start)
pid = p.pid
glan = psutil.Process(pid) #监听控制进程

while True:
time_now = time.time() - start # ??
if psutil.pid_exists(pid) is False: #运行错误
problem_info['time'] = time_now*1000
problem_info['memory'] = max_rss/1024.0
problem_info['result'] = "Runtime Error"
return problem_info
m_infor = glan.memory_info()
print(m_infor)
rss = m_infor[0] #获取程序占用内存空间 rss
if p.poll() == 0: #运行正常结束,跳出循环,继续判断
end = time.time()
break