Skip to content

评测镜像与运行时

Neuro OJ 的评测通过 Docker 镜像承载:出题人代码(evaluator)与用户代码(solution)分别运行在独立镜像的容器中。本文说明镜像白名单机制、Python 双容器运行时与常见问题。

现状

当前评测运行时仅实现 Python(双容器 Evaluator / Solution SDK 均为 Python 实现,支持包模板固定 python3)。多语言评测(C++/Java/JavaScript 等)是项目的决策性不做项——LMCC 仅要求 Python,项目不会提供其他语言的评测运行时。

运行时选择

提交接口按语言标识接受代码,当前已登记的语言标识:

语言标识说明
python3 / pythonPython 3(唯一具备完整评测运行时的语言)
cpp / c / javascript接口预留标识,无评测运行时,不可提交评测

题目可选的编程语言由出题人在运行时配置中声明,做题人页面只会看到该题启用的语言。

运行时选择的三层模型

  1. 语言标识:提交时声明的 language 字段,决定提交文件名(当前固定映射为 main.py)。
  2. 运行时镜像:Docker 镜像,分为 evaluator(跑出题人代码)与 solution(跑用户代码 + Solution Host)两类。
  3. 题目配置:题目的 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 可用,其他标识无法评测。

Neuro OJ 是一个独立社区项目,与 CCF 及 LMCC 无官方关系。