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

Jupyter运行正常的代码在终端/Flask中报RecursionError递归深度超限

问题原因及解决方案

核心原因

  • 你核验的递归限制是全局上限值,实际可用递归深度 = 全局递归上限 - 执行到当前代码时已经占用的栈深度
  • Jupyter内核启动时加载的前置逻辑比终端Python、Flask进程少,执行到目标代码时已占用的栈深度更低,剩余可用递归深度刚好可以覆盖SNOMEDCT节点遍历所需的2981次递归调用;终端和Flask进程已占用的栈深度更高,剩余可用深度不足,因此触发报错

解决方案

方案1:临时调高递归限制(最快修复)

在调用descendants()之前手动调高递归上限即可,示例代码:

import sys
from pymedtermino.snomedct import SNOMEDCT

# 调高到4000,预留足够的递归空间
sys.setrecursionlimit(4000)
all_disorder_concepts = list(set(list(SNOMEDCT[64572001].descendants())))

方案2:改用迭代方式遍历(永久规避递归深度问题)

手动实现迭代版的节点遍历逻辑,完全不依赖Python调用栈,不受递归限制约束,适合层级极深的树/图遍历场景:

from pymedtermino.snomedct import SNOMEDCT

def get_all_descendants(root_concept_id):
    visited = set()
    stack = [SNOMEDCT[root_concept_id]]
    while stack:
        current = stack.pop()
        if current.code not in visited:
            visited.add(current.code)
            # 加入所有未访问的子节点
            stack.extend([child for child in current.children if child.code not in visited])
    # 返回所有子节点概念对象
    return [SNOMEDCT[code] for code in visited]

all_disorder_concepts = get_all_descendants(64572001)

栈大小校验方法(可选)

  • Linux/macOS 环境下在终端执行 ulimit -s 即可查看当前Shell启动进程的默认栈大小,单位为KB,默认值通常为8192(8MB)
  • Windows 环境下可通过任务管理器「详细信息」列添加「栈提交大小」项,查看对应Python进程的栈占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:27:03