Jupyter导入同目录py脚本函数触发NameError问题排查
问题根因
.py格式的自定义脚本完全可以正常导入到同环境的Jupyter Notebook中,你遇到的NameError: name 'tz' is not defined和跨文件格式的导入能力无关,核心诱因集中在几个高频场景:
- 修改完
toolbox.py后没有保存文件,Python导入时读取的是未定义tz函数的旧版本文件 - Python内核缓存了历史加载过的同名
toolbox模块(比如之前创建过同名空文件、环境其他路径下存在同名toolbox包),没有加载你当前目录下的目标脚本 - 你执行的
!export PYTHONPATH=.命令本身是无效操作:Jupyter中每个!开头的shell命令都运行在独立子shell中,环境变量修改不会作用到当前Notebook的Python内核,不过从你贴的sys.path输出看,脚本所在目录已经在Python搜索路径列表中,这个点不是本次报错的直接原因。
排查与修复步骤
按顺序执行以下操作即可解决问题:
- 先确认文件状态:打开
toolbox.py,确认def tz(): print('works')的代码已经写入,按Cmd+S(macOS)/Ctrl+S(Windows/Linux)保存文件,这是最容易被忽略的低级错误。 - 清空模块缓存,验证实际加载的模块来源,在Notebook中新建代码块运行以下代码:
import sys # 删掉内核中已缓存的旧toolbox模块 if 'toolbox' in sys.modules: del sys.modules['toolbox'] import toolbox # 打印实际加载的toolbox文件路径,确认是否为目标目录下的文件 print("当前加载的toolbox路径:", toolbox.__file__) # 打印toolbox模块包含的所有成员,确认tz函数存在 print("toolbox内的成员列表:", dir(toolbox))
- 如果打印出的路径不是
/Users/justinbenfit/Desktop/Programming/Python/Explorium /transformations_deduping/ipynb/toolbox.py,说明环境中存在其他同名的toolbox模块/包,将其他同名的文件或文件夹重命名即可。 - 如果路径正确,但成员列表中没有
tz,回到第一步确认toolbox.py已经保存了tz函数的定义。 - 验证通过后,再执行函数调用即可正常运行:
from toolbox import * tz() # 预期输出:works
- 如果以上操作后仍有异常,直接在Notebook菜单栏选择
Kernel -> Restart Kernel重启内核,从头运行代码块即可完全清空所有旧模块缓存。
编码建议
- 尽量避免使用
from xxx import *的导入方式,这种写法容易引发命名冲突,且出现问题时很难排查变量/函数来源。优先使用import toolbox后通过toolbox.tz()调用,或者明确写from toolbox import tz导入需要的函数。 - 后续开发中如果修改了toolbox.py的代码,不需要重启内核也可以通过
importlib重载模块拿到最新代码:
import importlib importlib.reload(toolbox)
内容的提问来源于stack exchange,提问作者Justin Benfit
相关产品推荐
相关产品推荐

