跳转至

问题运行环境

由于 ZJUI-Learn 在用户不完全控制的环境中执行问题代码,因此准确了解 ZJUI-Learn 如何执行代码会很有用。本页讨论代码执行的环境,包括可用的第三方库以及如何安装您自己的库。

一般信息

问题的所有 server.py 文件都在从 prairielearn/prairielearn 映像创建的 Docker 容器中执行。该映像包含Python 3.13以及pyproject.toml中的包。唯一保证安装的软件包是 pyproject.toml 文件的依赖项部分中列出的软件包。

要运行此 Python 环境的命令行版本,您可以使用以下命令启动它:

docker run -it --rm prairielearn/prairielearn /bin/bash

在您的课程中安装库

添加自定义库的最快方法是将它们直接安装到您的课程中。这假设您熟悉使用 Git 和 Docker。如果您不熟悉,建议遵循安装PL进行本地开发指南。

  1. 使用 Git 在本地查看课程副本,并确保主分支是最新的。
  2. 找到您要安装的软件包。您可以在 Python Package Index 中找到所有可用 Python 库的列表。
  3. 在课程存储库的根目录中,创建一个名为 serverFilesCourse 的目录(如果尚不存在)。
  4. 使用以下命令将该包安装到课程的 serverFilesCourse 目录。确保分别将 <path-to-course><library> 替换为本地计算机上的课程和要安装的库的绝对路径。

    docker run -it --rm -v <path-to-course>:/course prairielearn/prairielearn uv pip install --target /course/serverFilesCourse <library>
    
  5. 使用 Git,提交并推送现在位于 serverFilesCourse 目录中的新文件。

Note

本地安装可能会生成在 .gitignore 中通常被忽略的编译文件。例如,使用本机代码的包通常包含 *.so 文件。使用已安装的软件包需要这些文件,因此如果遇到问题,请确保在 Git 中提交这些文件。可以使用 git status --ignored 查看被忽略的文件。

完成这些步骤后,您应该能够像平常一样在 server.py 文件中 import 库。如果您还希望在外部评分器中使用这些库,则需要确保您的评分器映像也包含这些包。同样,如果您还希望在工作区中使用这些库,您将再次需要确保您的工作区映像包含这些包。这两个操作都可以通过创建自定义评分器或工作区图像 来完成。

将库添加到 ZJUI-Learn

如果库非常大或需要特定的依赖项,则将其直接安装到您的课程中可能不可行。在这种情况下,您可以打开拉取请求将其添加到 ZJUI-Learn 的内置依赖项中。这应该作为最后的手段,并需要得到维护者的批准。请注意,此过程将需要更多时间,因为您的更改必须经过审查、合并和部署。因此,只有在直接安装在您的课程中不起作用的情况下才使用此功能,并且您有理由相信添加特定库可能会使 ZJUI-Learn 社区总体受益。

Note

以下说明假设您对 Git 有一定的了解。如果不是这种情况,您可以通过在 ZJUI-Learn GitHub 页面上创建问题 来请求添加该库。如果您熟悉 Git 并且希望继续处理拉取请求,请确保您遵循 ZJUI-Learn 贡献指南

在 PyPI 上找到库和版本

ZJUI-Learn从Python包索引下载其所有Python包;您的第一步应该是找到您想要的软件包和版本。您可以在左侧的“发布历史记录”下找到版本。大多数情况下,应选择最新版本,除非有特定需要旧版本。

SciPy 发布页面 SciPy 的示例。截至撰写本指南时,最新版本是 1.6.1

将库添加到pyproject.toml

ZJUI-Learn 使用的 Python 库的列表存储在 pyproject.toml 文件中。注意,不同的环境有不同的依赖文件:

  • 根目录下的pyproject.toml文件用于题目运行环境,主要影响个别题目和自定义元素中的server.py
  • 外部评分器(例如 Python 评分器C/C++ 评分器)在 graders 目录的 requirements.txt 中拥有自己的一组依赖项。
  • 工作空间 与 Jupyterlab 或 VSCode 环境一样,在 workspaces 目录中的 requirements.txt 中有自己的一组依赖项。

然后,创建一个分支和一个新分支,并更新您要修改的文件(s)。在您要更新的每个文件中,以 library==version 格式在新行中添加新库和版本,注意保持文件中的字母顺序:

...
scikit-learn==1.8.0
+scipy==1.16.3
sphinx-markdown-builder==0.6.0
...

当您对编辑感到满意时,提交并推送更改,然后在 ZJUI-Learn 存储库中创建拉取请求

如果你已经到了这一步,那么你就完了! ZJUI-Learn 维护人员之一将很快查看您的拉取请求。