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

为何给定Python代码可在PyCharm运行却无法在Jupyter执行?

代码在PyCharm正常运行但Jupyter报错的原因分析

先贴出问题代码:

import sys

list1 = [1, 2, 4, 4, 2, 5, 6, 1, 8, 9, 10, 11, "sddvdfvdfv", "feefegrge"]


def splitlist(list1, s):
    list2 = []
    l = []
    li = iter(list1)
    for _ in range(len(list1)):
        l = []

        for i in range(s):

            try:
                p = next(li)
            except Exception:
                print("Original List >>")
                print(list1)
                print("Smaller list >>")
                list2.append(l)
                for k in list2:
                    print(k, end="\t")
                sys.exit()
            else:
                l.append(p)
        list2.append(l)


while True:
    s = int(input("Enter size for smaller lists>>"))
    if s <= len(list1) or s == 1:
        splitlist(list1, s)
        break

报错核心原因

从截图的SystemExit错误信息可知,问题出在sys.exit()的调用逻辑上:

  • 在PyCharm这类IDE的脚本运行模式中,sys.exit()会直接终止当前进程,程序正常结束,不会触发异常提示。
  • 但Jupyter Notebook是交互式运行环境,它不会允许脚本直接终止整个解释器进程,而是会捕获sys.exit()抛出的SystemExit异常,并将其显示为报错。你的代码在迭代器元素耗尽时会进入except块调用sys.exit(),这就触发了Jupyter的异常捕获机制。

快速修复方案

把sys.exit()替换为return即可,此时列表分割和结果打印的逻辑已经完成,不需要终止整个解释器:
修改后的except块代码:

except Exception:
    print("Original List >>")
    print(list1)
    print("Smaller list >>")
    list2.append(l)
    for k in list2:
        print(k, end="\t")
    return  # 替换sys.exit()

另外补充一点:代码中外层的for _ in range(len(list1))属于冗余逻辑,迭代器会自动耗尽,这个循环会执行多余次数,也可以优化掉,但这不是报错的直接原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:06:17