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

导入Jupyter Notebook函数到Python脚本调用报NameError如何解决

问题原因
  • %run是IPython专属魔术命令,直接在IPython环境运行test_b.py时,该命令会将test_a.ipynb中定义的函数、变量默认注入到当前交互式会话的全局命名空间,test_b函数调用时可以正常找到全局作用域下的test_a。
  • 当通过其他脚本导入test_b模块时,Python导入机制会为test_b生成独立的模块级全局命名空间,默认配置下%run执行notebook的结果不会注入到该模块的全局命名空间中,test_b函数执行时会在自己所属模块的全局作用域查找test_a,找不到就抛出NameError。
解决方法
  • 方案1:给%run添加-i参数,强制将notebook运行结果注入到当前全局命名空间,修改test_b.py的调用代码即可:
get_ipython().run_line_magic('run', '-i test_a.ipynb')
def test_b():
    test_a()

该方案改动最小,适配原有写法。

  • 方案2:使用专门的库导入notebook文件,符合Python标准导入逻辑,避免命名空间混乱。
    先安装依赖:pip install import-ipynb
    再修改test_b.py代码:
import import_ipynb
import test_a

def test_b():
    test_a.test_a()

该方案稳定性最高,同时兼容普通Python解释器运行(只要安装了对应依赖)。

  • 方案3:执行%run后手动将test_a绑定到模块全局作用域:
get_ipython().run_line_magic('run', 'test_a.ipynb')
globals()['test_a'] = locals()['test_a']
def test_b():
    test_a()

注意:get_ipython()只有IPython环境可用,如果需要在原生Python解释器下运行脚本,不要使用魔术命令的调用方式,优先选择方案2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:24:07