Appearance
评测镜像与运行时
Neuro OJ 的评测通过 Docker 镜像承载:出题人代码(evaluator)与用户代码(solution)分别运行在独立镜像的容器中。本文说明镜像白名单机制、Python 双容器运行时与常见问题。
现状
当前评测运行时仅实现 Python(双容器 Evaluator / Solution SDK 均为 Python 实现,支持包模板固定 python3)。多语言评测(C++/Java/JavaScript 等)是项目的决策性不做项——LMCC 仅要求 Python,项目不会提供其他语言的评测运行时。
运行时选择
提交接口按语言标识接受代码,当前已登记的语言标识:
| 语言标识 | 说明 |
|---|---|
python3 / python | Python 3(唯一具备完整评测运行时的语言) |
cpp / c / javascript | 接口预留标识,无评测运行时,不可提交评测 |
题目可选的编程语言由出题人在运行时配置中声明,做题人页面只会看到该题启用的语言。
运行时选择的三层模型
- 语言标识:提交时声明的
language字段,决定提交文件名(当前固定映射为main.py)。 - 运行时镜像:Docker 镜像,分为
evaluator(跑出题人代码)与solution(跑用户代码 + Solution Host)两类。 - 题目配置:题目的
runtime_config指定 evaluator / solution 的镜像、命令与资源限制。
Judge Worker 只运行白名单内的镜像(judgeImages 表,含 image / kind / mode 匹配规则),启动时通过 Redis RPC 获取白名单。
Python 双容器是如何工作的
Python 题目使用两个镜像:
noj-evaluator-python:运行出题人的evaluate.py。noj-solution-python:运行用户提交的solution.py,由 Solution Host 加载模块,把 stdout 重定向到 stderr(避免污染评测协议),并向 evaluator 暴露函数调用接口。
镜像由 noj-judge/scripts/build-sdk-images.sh 构建(默认 tag :latest,与 noj-core 种子数据 judge_images 登记一致)。
Evaluator 通过 Evaluator SDK 调用用户函数,双方协议见 RPC 与可传递数据。
常见问题
- 提交显示
SystemError:优先检查镜像是否已构建(build-sdk-images.sh)、是否在白名单中、题目runtime_config的镜像名是否与白名单一致。 - 语言选项不出现:该题未在运行时配置中启用该语言——但请注意当前仅 Python 可用,其他标识无法评测。