
scikit-learn 开发环境搭建指南从 Fork 仓库到可编辑安装与 pre-commit 配置【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn本文是 scikit-learn 开发者文档 development_setup.rst 的完整技术解读与实操扩展面向想要为本仓库贡献代码的开发者。读完本文你将掌握如何 Fork 并克隆 scikit-learn 仓库、按 Windows/macOS/Linux 三平台搭建带 OpenMP 编译器的隔离开发环境、用 meson-python 完成可编辑安装并验证版本、运行测试套件以及配置 pre-commit 钩子保证提交质量。文中所有命令均可直接复制执行并配有 pyproject.toml、sklearn/_min_dependencies.py、.pre-commit-config.yaml 等仓库文件作为源码级依据。一、为什么需要专门搭建开发环境scikit-learn 不是一个纯 Python 项目。它包含大量用 Cython 编写的扩展模块分布在 sklearn 目录下的.pyx/.pxd文件中例如sklearn/linear_model/_sag_fast.pyx、sklearn/metrics/_dist_metrics.pyx等这些扩展需要经过 C/C 编译、链接后才能真正被import sklearn使用。因此在开发环境上有两个硬性要求隔离的 Python 环境使用 venv 或 conda 创建独立环境将开发版本与系统里已安装的 scikit-learn 二进制包隔离开避免依赖冲突。这既能避免污染全局环境也能确保你测试的确实是自己改的源码。带 OpenMP 支持的 C/C 编译器scikit-learn 的 Cython 扩展在编译和运行时依赖 OpenMP 进行并行计算。缺少 OpenMP 会导致编译失败或运行时警告每个平台的编译器配置方式不同见下文第三节。关于 Python 版本pyproject.toml 中声明requires-python 3.11即至少需要 Python 3.11文档中记作 |PythonMinVersion|。构建后端为mesonpymeson-python因此构建期还依赖 meson 和 ninja。二、Fork 仓库并配置本地克隆2.1 Fork 上游仓库在 GitHub 上登录你的账号打开 scikit-learn 项目主页点击页面顶部的 Fork 按钮即可在你的账号下创建一份代码副本。这是标准 GitHub 工作流的第一步为后续提交 Pull Request 做准备。2.2 克隆你的 Fork 到本地将你账号下的 fork 克隆到本地磁盘如果你的网络较慢可以追加--depth 1只拉取最新一次提交以加速git clone https://github.com/YourLogin/scikit-learn.git # 网络慢可加 --depth 1 cd scikit-learn注意命令中的YourLogin要替换成你自己的 GitHub 用户名。2.3 添加上游 remote 并核对克隆下来的仓库默认只有origin指向你的 fork。还需要添加upstreamremote保存对官方 scikit-learn 仓库的引用。这是后续同步最新代码的基础也是开发工作流development_workflow中必须的一步git remote add upstream https://github.com/scikit-learn/scikit-learn.git检查两个 remote 是否配置正确git remote -v正确的输出应类似origin https://github.com/YourLogin/scikit-learn.git (fetch) origin https://github.com/YourLogin/scikit-learn.git (push) upstream https://github.com/scikit-learn/scikit-learn.git (fetch) upstream https://github.com/scikit-learn/scikit-learn.git (push)配置完成后日常同步上游代码的标准操作是git fetch upstream后基于upstream/main创建新分支进行开发。三、创建隔离环境并安装依赖官方文档推荐使用 venv 或 conda 创建独立环境。两种方式都可行但依赖安装清单基本相同除运行时依赖numpy、scipy、joblib、threadpoolctl、narwhals外还需要构建工具链cython、meson-python、ninja、测试工具pytest、pytest-cov和代码质量工具ruff、pyrefly、numpydoc、pre-commit。这些版本要求并非随意指定sklearn/_min_dependencies.py 中定义了各依赖的最低版本常量与当前仓库实际要求一致NUMPY_MIN_VERSION 1.24.1 SCIPY_MIN_VERSION 1.10.0 JOBLIB_MIN_VERSION 1.4.0 NARWHALS_MIN_VERSION 2.0.1 THREADPOOLCTL_MIN_VERSION 3.5.0 CYTHON_MIN_VERSION 3.1.2其中cython、numpy、scipy标注为 build, install构建期 安装期都需要joblib、narwhals、threadpoolctl为纯安装期依赖。安装时请确保版本不低于上述数值。3.1 Windows先决条件——安装带 OpenMP 的编译器无论选择 conda 还是 pip 路线都需要先下载并运行 Visual Studio Build Tools 安装器。安装时务必勾选Desktop development with C工作负载见文章开头的截图它包含了 MSVC 编译器与 OpenMP 支持。conda 路线推荐下载并安装 conda-forge 分发的 Miniforge然后在 Miniforge Prompt 中执行conda create -n sklearn-dev -c conda-forge ^ python numpy scipy narwhals cython meson-python ninja ^ pytest pytest-cov ruff0.12.2 pyrefly numpydoc ^ joblib threadpoolctl pre-commit conda activate sklearn-devpip 路线先安装 64 位 Python 3.11 或更高版本然后创建虚拟环境python -m venv sklearn-dev sklearn-dev\Scripts\activate # 激活环境 pip install wheel numpy scipy cython meson-python ninja ^ pytest pytest-cov ruff0.12.2 pyrefly numpydoc ^ joblib threadpoolctl pre-commit3.2 macOSmacOS 自带的默认 C 编译器不直接支持 OpenMP需要先做额外配置。conda 路线先安装 Xcode 命令行工具再安装 Miniforgexcode-select --install conda create -n sklearn-dev -c conda-forge python \ numpy scipy cython meson-python ninja \ pytest pytest-cov ruff0.12.2 pyrefly numpydoc \ joblib threadpoolctl compilers llvm-openmp pre-commit conda activate sklearn-dev注意这里额外安装了compilers和llvm-openmp两个包前者是从 conda-forge 提供的基于 LLVM 工具链、带 OpenMP 的 C/C 编译器元包后者提供 OpenMP 运行时库。pip 路线先安装 Xcode 命令行工具再用 Homebrew 安装 LLVM OpenMP 库xcode-select --install brew install libomp之后安装 Python 3.11可用brew install python或官网安装包创建并激活虚拟环境然后安装依赖python -m venv sklearn-dev source sklearn-dev/bin/activate # 激活环境 pip install wheel numpy scipy cython meson-python ninja \ pytest pytest-cov ruff0.12.2 pyrefly numpydoc \ joblib threadpoolctl pre-commit3.3 Linuxconda 路线安装 Miniforge 后创建环境compilers提供带 OpenMP 的 C/C 编译器conda create -n sklearn-dev -c conda-forge python \ numpy scipy cython meson-python ninja \ pytest pytest-cov ruff0.12.2 pyrefly numpydoc \ joblib threadpoolctl compilers pre-commit conda activate sklearn-devpip 路线先确认 Python 版本python3 --version需 3.11然后按发行版安装编译工具链Debian 系如 Ubuntubuild-essential包含编译器另需 Python 头文件sudo apt-get install build-essential python3-devRedHat 系如 CentOS安装 C 与 C 编译器gcc/gcc-c及 Python 头文件sudo yum -y install gcc gcc-c python3-develArch LinuxPython 头文件已随 Python 安装gcc已包含所需 C/C 编译器sudo pacman -S gcc装好编译器后创建虚拟环境并安装 Python 依赖python -m venv sklearn-dev source sklearn-dev/bin/activate # 激活环境 pip install wheel numpy scipy cython meson-python ninja \ pytest pytest-cov ruff0.12.2 pyrefly numpydoc \ joblib threadpoolctl pre-commit四、可编辑安装 scikit-learn源码构建确保已进入scikit-learn目录且sklearn-dev环境已激活然后执行可编辑安装。这是整个搭建流程的核心命令pip install --editable . --verbose --no-build-isolation --config-settings editable-verbosetrue各选项的含义选项作用--editable .以可编辑模式安装当前目录源码变更即时生效无需重复安装--verbose输出完整构建日志便于排查编译错误--no-build-isolation禁用构建隔离直接使用当前环境中已装好的 cython、meson-python 等构建依赖--config-settings editable-verbosetrue推荐可选参数见下方说明关于--config-settings editable-verbosetrue这个设置是可选的但强烈推荐。meson-python 的可编辑安装机制是当执行import sklearn时自动重建包。如果不加这个设置首次 import 时会长时间无输出你无法判断是正在编译还是卡死了加上后重建发生时终端会打印明确提示避免无反馈等待。它的附带好处是你只需要运行一次pip install之后每次import sklearn时源码都会被自动重新编译改动 Cython/Python 源码后无需手动重装。注意--config-settings仅受 pip 23.1 及以上版本支持如果提示不支持先执行pip install -U pip升级。验证安装是否成功检查安装的 scikit-learn 版本号是否以.dev0结尾表明这是从源码构建的开发版而非发行版二进制包python -c import sklearn; sklearn.show_versions()输出中sklearn一项应为类似1.x.y.dev0的版本号。至此你的开发环境已就绪。运行测试套件文档建议现在就跑一遍测试虽然耗时较长以验证安装正确并提前熟悉那些与你改动无关的既有告警或报错避免后续把环境问题误当成自己代码的问题pytest关于测试的更高效用法可参考 doc/developers/tips.rst 中的 pytest 技巧小节例如按 node id 精确运行单个测试pytest -v sklearn/linear_model/tests/test_logistic.py::test_sparsify按名称关键字筛选pytest sklearn/tests/test_common.py -v -k LogisticRegression失败时进入调试器pytest --pdb不捕获 print 输出pytest -s另外pyproject.toml 的[tool.pytest.ini_options]中预设了本仓库的 pytest 行为testpaths sklearn默认只测 sklearn 包、--import-modeimportlib、faulthandler_timeout 600单个测试 10 分钟超时后自动转储所有线程回溯并终止会话用于排查死锁运行pytest时这些配置会自动生效。五、配置 pre-commit 钩子最后一步是安装 pre-commit 钩子。它会在每次提交前自动检查代码是否符合 lint 规范属于开发工作流中的质量闸门pre-commit install本仓库的钩子清单定义在 .pre-commit-config.yaml 中包含以下检查项Hook作用check-yaml/end-of-file-fixer/trailing-whitespace基础格式检查YAML 合法性、文件末尾换行、行尾空白ruff-checkv0.12.2Python lint 与自动修复对应pyproject.toml中[tool.ruff]的规则配置ruff-format代码格式化与[tool.ruff]中的line-length 88保持一致pyrefly-check类型检查对应pyproject.toml中[tool.pyrefly]的project-includes范围cython-lint检查.pyx/.pxdCython 文件附带--ban-relative-importssphinx-lint检查 Sphinx 文档源码.rst语法prettier格式化doc/css/styles/与doc/js/scripts/下的 CSS/JS 文件codespell拼写检查忽略词表见build_tools/codespell_ignore_words.txt其中多处注明了更新版本时需同步修改 sklearn/_min_dependencies.py这正是前文CYTHON_MIN_VERSION、NUMPY_MIN_VERSION等常量存在的意义——它们同时约束构建环境与 CI 的依赖版本。六、开发环境速查清单按本文步骤完成后的最终状态✅ 已 Fork scikit-learn 仓库本地克隆配置了origin和upstream两个 remote✅ 已用 venv 或 conda 创建sklearn-dev隔离环境✅ 已安装全部构建/测试/质量工具cython、meson-python、ninja、pytest、ruff、pyrefly、pre-commit 等✅ 已执行pip install --editable .import sklearn显示.dev0版本号✅ 已通过pytest跑通或部分跑通测试套件✅ 已执行pre-commit install提交前自动 lint下一步即可阅读 doc/developers/contributing.rst 了解提交流程与 PR 检查清单含完整测试要求或参考 doc/developers/develop.rst 学习如何开发 scikit-learn 兼容的 estimator。若在搭建过程中遇到编译错误重点检查两点编译环境是否具备 OpenMP 支持、各依赖版本是否达到 sklearn/_min_dependencies.py 中的最低要求。【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考