使用 kedro new 创建新 Kedro 项目:交互式向导、工具选择与源码级解析
【免费下载链接】kedroKedro is a toolbox for production-ready data science. It uses software engineering best practices to help you create data engineering and data science pipelines that are reproducible, maintainable, and modular.项目地址: https://gitcode.com/GitHub_Trending/ke/kedro
本篇指南完整讲解 Kedro 中创建新项目的核心命令kedro new:从交互式问答(项目名称、工具选择、示例管线、遥测同意)到单行非交互式命令,再到 YAML 配置文件方式,并结合当前仓库源码(starters.py、prompts.yml、cookiecutter.json)解析每一步背后的校验逻辑、命名推导规则与示例选择机制。读完本文,你将能够熟练创建基础 Kedro 项目、按需装配 lint/test/log/docs/data/pyspark 等工具,并理解生成项目的目录骨架。
Introducingkedro new
kedro new是创建 Kedro 项目的入口命令。要创建一个包含默认代码(用于搭建你自己的节点与管线)的基础 Kedro 项目,只需导航到目标目录并执行:
uvx kedro new说明:使用
uvx可以在不把 Kedro 安装进系统或虚拟环境的情况下运行它——uvx每次都会在一个干净的临时环境中下载并运行 Kedro。如果你更倾向标准安装方式(例如 pip + 虚拟环境),可参考安装指南。
需要特别注意的是,kedro new流程依赖Git已安装——因为创建过程中需要从模板仓库拉取对应的 starter 模板(这一点从源码中_get_cookiecutter_dir使用cookiecutter.repository.determine_repo_dir克隆远程模板仓库的实现可以印证)。
从底层实现看,kedro new最终会调用 starters.py 中的new命令(@click.command装饰、--config/--starter/--checkout/--directory/--name/--tools/--example/--telemetry等选项均在 starters.py#L295-L330 定义),随后基于 cookiecutter.json 和 prompts.yml 生成extra_context,最终调用 cookiecutter 渲染出项目目录。
项目名称(Project name)
CLI 首先询问项目的人类可读名称(human-readable name),它允许包含字母数字符号、空格、下划线和连字符,且长度至少为 2 个字符。
该名称会被保存为project_name,同时 Kedro 会基于它自动推导仓库目录名(repo_name)和 Python 包名(python_package)。例如输入Get Started:
| 描述 | 配置项 | 示例 |
|---|---|---|
| 新项目的人类可读名称 | project_name | Get Started |
| 存放项目的本地目录 | repo_name | get-started |
| 项目的 Python 包名(短、全小写) | python_package | get_started |
这种推导关系在仓库中可以直接验证:模板 cookiecutter.json 中定义了:
{ "project_name": "New Kedro Project", "repo_name": "{{ cookiecutter.project_name.strip().replace(' ', '-').replace('_', '-').lower() }}", "python_package": "{{ cookiecutter.project_name.strip().replace(' ', '_').replace('-', '_').lower() }}", ... }而 starters.py#L189-L192 中的_derive_package_name函数与模板保持一致的变换规则(去空格、-/ 替换为_、转小写)。
包名冲突校验:拒绝与 Python 关键字 / 标准库重名
如果一个名称推导出的包名恰好是 Python 关键字或标准库模块名(例如email、json、import),项目将被拒绝创建。原因在 starters.py#L195-L213 的_validate_package_name_is_importable中有明确注释:kedro new会通过<package>.pipeline_registry来导入生成的项目,如果包名遮蔽了email、json等标准库模块或本身就是关键字,后续kedro run会以令人困惑的ModuleNotFoundError失败,因此在创建时就拦截。
对应测试在 test_new_from_cli_flags.py#L174-L208 中:email、json、string、JSON、import会被拒绝;而仅仅“包含”标准库子串的email-service、my-json-app、import_data因推导出的包名合法而被允许。
项目工具(Project tools)
接下来 CLI 会询问要为项目装配哪些工具:
Tools 1) Lint: Basic linting with ruff 2) Test: Basic testing with pytest 3) Log: Additional, environment-specific logging options 4) Docs: A Sphinx documentation setup 5) Data Folder: A folder structure for data management 6) PySpark: Configuration for working with PySpark Which tools would you like to include in your project? [1-6/1,3/all/none]: (none):各工具的详细说明见新项目工具文档。
交互式输入的语法:可以用逗号分隔值(1,2,4)、范围值(1-3,5-7)、两者组合(1,3-5,7),也可以直接输入关键字all或none。直接回车(跳过提示)默认为none。这些语法由 starters.py#L926-L971 的_parse_tools_input解析(支持范围展开、校验范围起止大小、防止超大区间),并由_validate_tool_selection校验数字合法性。
使用--tools标志跳过交互:非交互方式按名称指定工具,例如:
uvx kedro new --tools=lint,test uvx kedro new --tools=all uvx kedro new --tools=none可选的工具名有:lint、test、log、docs、data、pyspark(交互提示中的数字选择仅用于回答提示时)。名称到数字的映射关系定义在 starters.py#L122-L141:lint→1、test→2、log→3、docs→4、data→5、pyspark→6。--tools的值会先经_validate_selected_tools校验(all/none不能与其他选项混用),再经_convert_tool_short_names_to_numbers转为数字、去重、排序,最终由_convert_tool_numbers_to_readable_names转回可读名称字符串写入extra_context。
也可以通过kedro new --help查看完整的工具说明。
项目示例(Project examples)
CLI 会询问是否包含示例管线代码:
Would you like to include an example pipeline? : (no):回答yes时,示例内容取决于之前选择的工具:
spaceflights-pandasstarter:当你选择了 linting、testing、自定义日志、文档、数据结构中的任意组合(且未同时选择 PySpark)时添加。spaceflights-pysparkstarter:当你选择了 PySpark 并搭配其他任意工具时添加。
这一选择逻辑的源码实现在 starters.py#L846-L873:当工具列表中出现PySpark时使用spaceflights-pyspark;否则当example_pipeline == "True"时使用spaceflights-pandas;两者皆非则使用本地默认模板路径TEMPLATE_PATH(即kedro/templates/project)。
每个 starter 示例都针对所选工具的能力与集成做了裁剪,能直观展示这些工具在真实项目中的用法。官方 starter 的别名注册见 starters.py#L107-L120(astro-airflow-iris、spaceflights-pandas、spaceflights-pyspark、databricks-iris、support-agent-langgraph)。
Quickstart 示例
以下三个速查用例分别对应交互式多步输入与等价的一行命令。
1. 创建一个名为My-Project的默认项目(无工具、无示例代码):
kedro new ⮐ My-Project ⮐ none ⮐ no ⮐等价一行命令:
uvx kedro new --name=My-Project --tools=none --example=n2. 创建一个名为spaceflights的项目(含测试工具与示例代码):
kedro new ⮐ spaceflights ⮐ 2 ⮐ yes ⮐等价一行命令:
uvx kedro new --name=spaceflights --tools=test --example=y3. 创建一个名为testproject的项目(含 lint、docs、PySpark,无示例代码):
kedro new ⮐ testproject ⮐ 1,4,6 ⮐ no ⮐等价一行命令:
uvx kedro new --name=testproject --tools=lint,docs,pyspark --example=n快捷标志:--name、--tools、--example均可单独用来跳过对应的交互步骤。例如uvx kedro new --name=spaceflights只跳过名称提问,uvx kedro new --example=y直接决定是否包含示例代码。
使用 YAML 配置文件创建项目
作为交互式流程的替代,你可以用 YAML 配置文件向kedro new提供全部取值。参考文件config.yml:
# config.yml "project_name": "My Project" "repo_name": "my-project" "python_package": "my project" "tools": "lint, test, log, docs, data, pyspark" "example_pipeline": "y"然后执行:
uvx kedro new --config=<path/to/config.yml>注意事项:
- 使用配置文件时,必须提供
project_name、repo_name、python_package三个值(源码_validate_config_file_against_prompts会基于 prompts.yml 校验缺失的必填键);tools与example_pipeline可选,缺省时分别默认none与no。 - 当
--config与--name、--tools、--example同时使用时,CLI 上的值会覆盖配置文件中的值(见_get_extra_context中selected_tools/project_name/example_pipeline对extra_context的覆盖逻辑,starters.py#L634-L641)。 - 配置文件中的
tools也接受工具短名列表(如"lint, test, log, docs, data, pyspark"),example_pipeline接受y/yes/n/no(大小写不敏感),文件解析时_parse_yes_no_to_bool会将其转为布尔字符串。
遥测同意(Telemetry consent)
--telemetry标志用于在创建项目的瞬间注册用户分析数据的同意状态,从而绕过首次在项目内执行kedro命令时才会出现的分析收集提示。若不使用该标志,则照常提示。
uvx kedro new --telemetry=yes # 同意收集 uvx kedro new --telemetry=no # 不同意收集取值yes(或y)表示同意,no(或n)表示拒绝;该参数在 starters.py#L324-L330 中被定义为click.Choice(["yes", "no", "y", "n"], case_sensitive=False)。同意结果会写入生成项目根目录下的.telemetry文件(内容形如consent: true/false),由_create_project在 cookiecutter 渲染完成后落盘(starters.py#L994-L996)。对应测试见 test_new_from_cli_flags.py#L211-L240,其中--telemetry=YES/y/Y等大小写变体均会生成.telemetry文件。
各工具能为项目带来什么
在创建时选中的工具会直接改变生成项目的结构与依赖。以下是逐项说明(详见新项目工具文档)。
Linting(Ruff)
将ruff加入项目依赖,并在pyproject.toml中预置默认配置:
#pyproject.toml line-length = 88 show-fixes = true select = [ "F", # Pyflakes "W", # pycodestyle "E", # pycodestyle "I", # isort "UP", # pyupgrade "PL", # Pylint "T201", # Print Statement ] ignore = ["E501"] # Ruff format takes care of line-too-long安装依赖后即可格式化与检查代码:
uv pip install -r requirements.txt ruff format path/to/project/root ruff check path/to/project/root更多内容可参考 linting 文档。
Testing(pytest)
引入tests目录(内含示例单元测试test_run.py),并把pytest加入依赖:
uv pip install -r requirements.txt pytest path/to/your/project/root/tests预置的 pytest 配置(来自模板中的pyproject.toml):
[tool.pytest.ini_options] addopts = """ --cov-report term-missing \ --cov src/{{ cookiecutter.python_package }} -ra""" [tool.coverage.report] fail_under = 0 show_missing = true exclude_lines = ["pragma: no cover", "raise NotImplementedError"]参考自动化测试文档了解更多。
Custom logging
在项目的conf目录引入logging.yml,提供console与info_file_handler两个额外 handler(默认配置为rich与info_file_handler),取代 Kedro 的默认日志配置。使用时需设置环境变量:
export KEDRO_LOGGING_CONFIG=conf/logging.yml详见 logging 文档。
Documentation(Sphinx)
在项目结构中新增docs目录,包含 Sphinx 配置conf.py与index.rst,支持自动生成 HTML 文档。测试 test_new_from_cli_flags.py#L53-L79 验证了生成docs/Makefile、make.bat、source/conf.py、source/index.rst以及.gitignore中docs/build/等条目。
Data structure
提供本地标准化的数据文件夹层级(如原始、中间、处理后数据)。如果要包含示例管线,此工具不能省略。Kedro 的能力不止于本地存储,通过 fsspec 兼容路径还可对接数据湖与各类数据库。目录结构约定可参见 kedro_concepts 文档。
PySpark
修改requirements.txt加入 PySpark 依赖,并调整项目设置以适配 Spark 作业,支持使用 Apache Spark 进行大规模数据处理。详见 PySpark 集成文档。
运行新项目
无论选择了哪些工具与示例代码,kedro new完成后,下一步都是进入项目目录并安装依赖:
cd <project-name> uv pip install -r requirements.txt然后运行项目:
kedro run警告:
kedro run要求项目中至少有一条带节点的管线。请在运行前定义管线,并确保它在pipeline_registry.py中完成注册。模板中的 pipeline_registry.py 即为管线注册入口;不包含任何带节点管线时,CLI 也会在创建时给出UserWarning提示(starters.py#L267-L272)。
生成的项目结构
使用基础模板(--tools=none --example=n)时,生成项目的骨架与仓库内 kedro/templates/project/{{ cookiecutter.repo_name }} 目录对应,包括:
conf/base/:catalog.yml、parameters.yml;conf/local/:credentials.yml;conf/logging.ymldata/:01_raw 至 08_reporting 的分层数据目录src/<python_package>/:pipeline_registry.py、settings.py、__main__.py、pipelines/目录tests/、docs/、notebooks/、pyproject.toml、requirements.txt、README.md
其中 settings.py 预置了CONFIG_LOADER_ARGS(base_env: base、default_run_env: local)、CONF_SOURCE、CONFIG_LOADER_CLASS、CONTEXT_CLASS、DATA_CATALOG_CLASS、SESSION_STORE_CLASS等项目的核心配置项。
可视化 Kedro 项目
Kedro-Viz 用于可视化项目管线,但它不属于标准 Kedro 安装,需要单独安装到虚拟环境:
uv pip install kedro-viz进入项目目录后启动:
kedro viz run该命令会自动打开浏览器标签页,在http://127.0.0.1:4141/提供可视化界面。退出可视化只需关闭浏览器标签页;要重新获得终端控制权,在 Mac 上按^+c,在 Windows 或 Linux 上按Ctrl+c。
从 Kedro-Viz 12.0.0 起,Workflow 视图可以让你可视化并调试最近一次kedro run的结果——哪些节点成功、失败或被跳过,一目了然:
工具选择总览流程图
下面的流程图概括了kedro new的完整选择路径(项目名 → 工具 → 示例):
Where next?
- 理解 Kedro 的核心概念:见基础概念文档。
- 动手实践:跟随 spaceflights 教程,体验从搭建项目、添加依赖、创建节点、注册管线、配置 Data Catalog、添加文档到打包项目的完整流程。
- Notebook 用户:学习如何将 Kedro 与 Jupyter notebook 结合。
深入:kedro new 的底层调用链
如果你对kedro new的实现细节感兴趣,可以沿着以下代码路径继续探索:
- 命令入口与参数定义:starters.py#L295-L330 定义
new命令及全部 CLI 选项。 - 输入校验:
_validate_flag_inputs(--starter不能与--tools/--example混用)、_validate_input_with_regex_pattern(名称/工具/示例的格式正则,正则模式见 starters.py#L158-L186,与 prompts.yml 中的regex_validator保持一致)、_validate_package_name_is_importable。 - 交互提示渲染:
_Prompt类(starters.py#L1013-L1049)从prompts.yml读取标题、文本、正则校验器并渲染彩色提示。 - 配置合并:
_get_extra_context依次合并配置文件/交互输入、CLI 标志与默认值(kedro_version、tools默认['None']、example_pipeline默认False),并以字符串字典形式交给 cookiecutter。 - 模板渲染:
_create_project调用cookiecutter.main.cookiecutter渲染模板、清理__pycache__、写入.telemetry并输出成功信息(starters.py#L974-L1010)。
仓库测试 test_new_from_cli_flags.py 覆盖了名称合法性、工具组合、示例选择、遥测文件生成等关键路径,是理解kedro new行为边界的最佳参考。
【免费下载链接】kedroKedro is a toolbox for production-ready data science. It uses software engineering best practices to help you create data engineering and data science pipelines that are reproducible, maintainable, and modular.项目地址: https://gitcode.com/GitHub_Trending/ke/kedro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考