三步配好 marimo 配置:运行时行为、编辑器显示与分层覆盖
【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimo
团队共享的一个数据分析 notebook 里,有人改了上游清洗逻辑,下游所有依赖单元格立刻自动重跑,一次就是十几秒,整张表在每个人打开文件时都会重新算一遍。这类问题不是代码 bug,而是执行策略没按项目需求配置。marimo 把运行时与编辑器的可调项集中在tool.marimo配置块里,这份 marimo 配置可以直接写进项目文件,随仓库一起分发。
让单元格按你的节奏重跑
痛点:改一行代码,全链路立刻重算。
marimo 按变量依赖决定哪些单元格要重算,stale 表示单元格被标记为"内容已过时",是否重跑由配置决定。两个开关控制这件事:
# pyproject.toml [tool.marimo.runtime] on_cell_change = "lazy" # 依赖更新后仅标记 stale,不自动重跑 # on_cell_change = "autorun" # 上游一变,下游立刻重跑- 写在项目级
pyproject.toml,覆盖用户配置,对仓库内所有人生效; - 源码默认值就是
"autorun"(见 marimo/_config/config.py 的DEFAULT_CONFIG),不配置就会自动重跑; - 副作用:改
lazy后下游输出不会自动刷新,需要手动点运行,别人看你的 notebook 时也可能看到旧结果,提交前建议手动 run all。
模块改动后的自动重载怎么设
auto_reload追踪你 import 的本地模块文件变化,类似 IPython 的%autoreload,但会精确到具体哪些单元格受影响:
[tool.marimo.runtime] auto_reload = "lazy" # 改动的模块对应的单元格被标记 stale # auto_reload = "autorun" # 受影响单元格自动重跑 # auto_reload = "off" # 默认值:模块改动不触发任何动作默认"off"意味着你改了公共模块后要自己刷新相关单元格;开lazy后重跑时机由你决定,适合频繁调试库代码的场景。注意这个配置写项目级即可,放用户全局配置同样有效——它属于 marimo/_config/config.py 中RuntimeConfig的一部分。
让 SQL 输出和界面贴合项目习惯
痛点:每次查询都要手动转 DataFrame,输出格式因人而异。
把 polars 设为 SQL 查询的默认输出
[tool.marimo.runtime] default_sql_output = "polars"可选值:auto(默认)、native、polars、lazy-polars、pandas。作用:项目里所有 SQL 单元格的结果默认以 polars DataFrame 呈现,免去逐格转换。副作用:如果运行环境没装 polars,查询会失败,所以这个值要放项目级配置并保证依赖装好;lazy-polars对大查询更省内存,但交互式探索时不如 eager 直观。
主题、字体与表格展示
[tool.marimo.display] theme = "dark" code_editor_font_size = 16 cell_output = "below" default_table_page_size = 20 dataframes = "rich"这一组只影响显示,不碰执行逻辑,可以按个人口味放用户配置;但default_table_page_size这类影响团队阅读习惯的项建议放项目级统一。theme还接受"light"和"system"。
四层配置的存放位置与优先级
痛点:个人偏好、项目规范、临时调整混在一个文件里,互相打架。
| 层级 | 存放位置 | 作用范围 | 典型用途 |
|---|---|---|---|
| 文件内脚本块 | notebook 头部# /// script内的[tool.marimo.xxx] | 仅该 notebook | 单个文件临时覆盖显示/运行时项 |
| 项目级 | 项目根pyproject.toml(tool.marimo) | 该目录树下所有 notebook | 团队统一规范,随 git 版本化 |
| 用户级 | ~/.config/marimo/marimo.toml(或~/.marimo.toml) | 当前用户的全部 notebook | 个人主题、键位、包管理器等偏好 |
| 默认值 | 源码内置DEFAULT_CONFIG | 兜底 | 未配置项的回退值 |
优先级从上到下递减:脚本块 > 项目级 > 用户级 > 默认值,合并逻辑见 marimo/_config/config.py 的merge_config。两个实际后果:
- 被上层覆盖的项,在编辑器设置面板里改了也不会生效,面板显示的是合并后的结果;
- 脚本块白名单有限制:
ai、mcp、completion、server等区块不允许出现在脚本元数据里,runtime.auto_instantiate也会被直接剥离并打警告。换句话说,文件内配置适合改display、on_cell_change,不适合用来动执行安全相关的项。
marimo config show可以查看当前生效的合并结果和配置文件位置,排查"我明明改了为什么不生效"时先跑这条命令。
团队统一与个人偏好的分工
痛点:格式、键位、包管理器各人一套,code review 吵半天。
保存、格式化与键位
# 项目级 pyproject.toml [tool.marimo.save] autosave = "after_delay" autosave_delay = 2000 format_on_save = true [tool.marimo.keymap] destructive_delete = falseformat_on_save = true让保存时代码按[tool.marimo.formatting]的line_length(默认 79)统一格式,省去风格争论;destructive_delete = false使删除有内容的单元格需要二次确认,防误删。keymap.preset支持"default"和"vim",vim 用户可在自己的用户配置里开 vim,不必改项目文件。
环境变量、包管理器与代码片段
# 临时调大单元格输出上限,不用动任何配置文件 export MARIMO_OUTPUT_MAX_BYTES=16000000这两个环境变量只在默认值层生效,配置文件中显式写出的同名项优先级更高。同类变量还有MARIMO_STD_STREAM_MAX_BYTES(控制台输出上限)。
包管理器显式指定,避免自动检测结果在不同机器上漂移:
[tool.marimo.package_management] manager = "uv" # 可选 "pip" / "rye" / "uv" / "poetry" / "pixi"团队代码模板放进片段目录:
[tool.marimo.snippets] custom_paths = ["./snippets"] include_default_snippets = truecustom_paths相对路径以项目根为准;设include_default_snippets = false可只保留团队片段,编辑器里就不会出现默认模板。
配置检查清单
- 项目级
pyproject.toml的tool.marimo已提交进版本控制 on_cell_change与auto_reload匹配项目节奏(重计算多则用lazy)default_sql_output与运行环境实际安装的库一致format_on_save打开,line_length与 CI 检查保持一致- 个人主题、键位只写用户配置,不写进仓库文件
marimo 配置的分层设计让团队规范和个人的习惯可以分开维护,按场景改对应那一层即可。
【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考