当前位置: 首页 > news >正文

DOMJudge批量导出比赛代码

DOMJudge竟然没有在前端提供一键导出比赛所有代码的功能,只能在数据库中导出。
以下是博主写的一段Python脚本,用于实现该功能。
该脚本也托管在Github上,仓库Yerosius/export_domjudge_code。
受限于博主水平,存在不可避免的疏忽之处,还望梅涵。
用法:

  1. 先安装本脚本用到的第三方库:
pip install mysql-connector-python tqdm pwinput
  1. 运行此脚本,输入数据库地址、账户、密码、数据库名、比赛ID,即可进行导出。导出后的目录结构为语言(c/cpp/java/py3)/队伍ID/题目ID/提交ID.ext,并打包为zip文件:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import os
import sys
import tempfile
import zipfile
import shutil
import mysql.connector
from tqdm import tqdm
import pwinputLANG_EXT = {'c': 'c','cpp': 'cpp','java': 'java','python3': 'py'
}def connect_db():db_host = input("Enter database host (default: localhost): ").strip() or "localhost"db_user = input("Enter database username (default: root): ").strip() or "root"db_pass = pwinput.pwinput("Enter database password: ", mask="*")db_name = input("Enter database name (default: domjudge): ").strip() or "domjudge"contest_id = input("Enter contest ID: ").strip()try:conn = mysql.connector.connect(host=db_host,user=db_user,password=db_pass,database=db_name)except mysql.connector.Error as err:print(f"[ERROR] Could not connect to database: {err}")sys.exit(1)return conn, contest_iddef query_submissions(conn, contest_id):cursor = conn.cursor(dictionary=True)query = """SELECT s.submitid, s.teamid, s.probid, s.langid, f.sourcecode, f.filenameFROM submission sJOIN submission_file f ON s.submitid = f.submitidWHERE s.cid = %sORDER BY s.langid, s.teamid, s.probid, s.submitid"""cursor.execute(query, (contest_id,))rows = cursor.fetchall()cursor.close()return rowsdef export_submissions(rows, temp_dir):total_files = len(rows)if total_files == 0:print("[WARNING] No submissions found for this contest.")return 0for row in tqdm(rows, desc="Exporting submissions", unit="file"):lang = row['langid']team = row['teamid']problem = row['probid']submitid = row['submitid']filename = row['filename'] or "submission"name, ext = os.path.splitext(filename)if not ext:ext = f".{LANG_EXT.get(lang, 'txt')}"final_filename = f"{name}_{submitid}{ext}"dir_path = os.path.join(temp_dir, lang, f"team_{team}", f"problem_{problem}")os.makedirs(dir_path, exist_ok=True)file_path = os.path.join(dir_path, final_filename)with open(file_path, "wb") as f:f.write(row['sourcecode'])return total_filesdef create_zip(temp_dir, contest_id):archive_name = f"contest_{contest_id}_submissions.zip"with zipfile.ZipFile(archive_name, "w", zipfile.ZIP_DEFLATED) as zipf:for root, dirs, files in os.walk(temp_dir):for file in files:abs_path = os.path.join(root, file)arcname = os.path.relpath(abs_path, temp_dir)zipf.write(abs_path, arcname)print(f"[INFO] All submissions packaged into: {os.path.abspath(archive_name)}")return archive_namedef main():print("DOMJudge Contest Source Code Export Tool")conn, contest_id = connect_db()temp_dir = tempfile.mkdtemp(prefix=f"contest_{contest_id}_")rows = query_submissions(conn, contest_id)conn.close()total_files = export_submissions(rows, temp_dir)if total_files == 0:shutil.rmtree(temp_dir)returncreate_zip(temp_dir, contest_id)shutil.rmtree(temp_dir)if __name__ == "__main__":main()
http://www.jsqmd.com/news/561879/

相关文章:

  • Python实战:线性回归模型调优与波士顿房价预测的深度解析
  • Charticulator创意可视化平台:从数据到图表的自由创作指南
  • 2026年褚立勇老师官方联系方式公示,沈阳理工大学继续教育学院招生合作便捷入口 - 第三方测评
  • HARMONYOS应用实例242:不等式组解集图示
  • Linux命令-mount(用于挂载Linux系统外的文件)
  • [Windows]-Git初始化配置
  • 别再被挂载搞晕了!手把手教你搞定Linux 0.11系统调用实验(附完整路径避坑指南)
  • 6大功能革新!Ice打造高效Mac菜单栏全攻略
  • 终极指南:30分钟从零开始搭建你的专属AI数字人助理
  • 企业号码认证收费标准详解:不同服务商报价差异对比 - 企业服务推荐
  • 大整数乘法运算
  • 龙虾尝鲜记(6)——Spec Kit 安装与使用全流程
  • Win11Debloat个性化配置指南:定制你的Windows系统体验
  • 告别性能玄学:用Unreal Insights的Trace Store和导出功能,给你的UE5项目做一次深度“体检报告”
  • 非原生微信小程序逆向:H5页面调试与授权劫持技巧
  • 突破平台壁垒的Scratch作品打包工具:TurboWarp Packager全解析
  • 如何3步搭建高效Web直播系统:Jessibuca Pro终极指南
  • 一文搞懂分库分表数据倾斜:问题、原理与解决方案
  • AD9361数字增益的隐藏陷阱:为什么你的SNR没有提升?(MGC模式避坑指南)
  • Linux命令-mpstat(显示各个可用CPU的状态)
  • 使用Yakit打BurpSuite靶场:API测试篇(API testing)
  • 嵌入式C语言轻量级单元测试框架Unity设计与实践
  • Elasticsearch:如何在 Elastic AI Builder 里使用 DSL 来查询 Elasticsearch
  • 磁盘smart信息
  • 号码品牌认证服务商哪家口碑好?从售后响应速度看服务质量 - 企业服务推荐
  • 告别环境混乱:Python3.9镜像实战教程,独立环境管理如此简单
  • Koikatsu游戏优化补丁:KK-HF_Patch完整指南与安装教程
  • Elasticsearch:如何在 workflow 里调用一个 agent
  • 基于YOLOv11目标检测结果的图像再创作:Wan2.2-I2V-A14B场景重构
  • 智能卡开发实战:ISO7816 APDU命令与响应全解析(附常见错误码对照表)