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
相关产品推荐
相关产品推荐

