You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Marimo遇异常时无正常打印输出,寻求调试解决方案

在Marimo中调试时保留print输出的解决方法

从Jupyter Lab切换到Marimo后,遇到调试问题:单元格代码触发异常时,print语句的输出会被错误信息覆盖,看不到执行到异常前的打印内容。比如运行以下代码:

a = {"a":1, "b":2}
print(a["a"])
a["c"]

仅显示KeyError,看不到print(a["a"])的输出;在循环中触发异常时,甚至连循环前的打印都看不到,只有反复按Ctrl+Enter时打印内容会闪一下就消失。尝试用mo.output.append()也没解决。

解决方法

1. 用mo.print()替代原生print()

Marimo自带的打印函数会确保输出被保留,即使后续代码抛出异常:

import marimo as mo

a = {"a":1, "b":2}
mo.print(a["a"])
a["c"]

运行后会先显示1,再展示KeyError信息。

2. 强制刷新标准输出流

如果必须用原生print,手动刷新输出流可以避免内容被覆盖:

import sys

datasets = ["a", "b", "c"]
print(datasets)
sys.stdout.flush()  # 强制输出到界面
for dataset in datasets:
    print(dataset)
    sys.stdout.flush()
    try:
        d = Dataset.get_by_name(dataset)
    except Exception as e:
        print(f"错误数据集:{dataset},原因:{e}")
        sys.stdout.flush()
        continue

3. 开启保留单元格输出设置

在Marimo的设置面板中,找到Cell Behavior选项,勾选"Keep previous output when running cell",这样单元格抛出异常时,之前的输出不会被清空。

4. 拆分单元格分步调试

把代码拆成多个小单元格,逐步运行定位问题:

  • 单元格1:定义并打印数据集
    datasets = ["a", "b", "c"]
    print(datasets)
    
  • 单元格2:循环执行(加索引方便定位)
    for idx, dataset in enumerate(datasets):
        print(f"正在处理第{idx}个:{dataset}")
        d = Dataset.get_by_name(dataset)
    

即使第二个单元格出错,第一个单元格的输出会保留,也能通过索引快速找到出错的数据集。

5. 使用断点调试

在代码中加入breakpoint(),运行时进入调试模式,可逐步执行、查看变量,同时保留每一步的输出:

datasets = ["a", "b", "c"]
print(datasets)
for dataset in datasets:
    print(dataset)
    breakpoint()  # 触发调试
    d = Dataset.get_by_name(dataset)

内容的提问来源于stack exchange,提问作者Freek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:20:10