Jupyter Notebook中两种模块导入方式的差异及第一种的实现方案
两种Python模块导入方式的区别与第一种方式的修复方案
嘿,我来帮你拆解这两种导入方式的核心差异,以及怎么让第一种导入代码正常运行:
一、两种导入方式的核心区别
1. 第一种导入方式:from utils.gradient_check import eval_numerical_gradient
这是Python的常规包导入方式,它的运行逻辑是:
- Python会在自己的模块搜索路径(也就是
sys.path列表里的目录)中,寻找名为utils的Python包(也就是包含__init__.py文件的目录,Python 3.3+支持无__init__.py的命名空间包,但常规场景还是建议有这个文件)。 - 找到
utils包后,再从包内的gradient_check.py模块中导入eval_numerical_gradient函数。 - 你的代码一开始运行失败,本质是因为
utils所在的父目录不在sys.path里,Python找不到这个包。
2. 第二种导入方式:手动添加路径后导入
import sys sys.path.append("/Users/W/dlp/src/03/utils") import gradient_check from gradient_check import eval_numerical_gradient
这种方式的逻辑完全不同:
- 你直接把
gradient_check.py所在的目录(也就是/Users/W/dlp/src/03/utils)添加到了sys.path中。 - 此时Python会把这个目录当成模块搜索的根目录,
gradient_check.py就变成了一个可以直接导入的顶层模块,而不是utils包下的子模块。 - 本质是绕开了“包导入”的逻辑,直接把单个模块所在目录加入搜索路径。
二、如何让第一种导入方式正常运行?
你只需要让Python能找到utils这个包就行,有几种靠谱的方法:
方法1:把utils的父目录加入sys.path
既然utils在/Users/W/dlp/src/03/目录下,你可以在代码开头添加:
import sys sys.path.append("/Users/W/dlp/src/03")
之后就能正常使用from utils.gradient_check import eval_numerical_gradient了——因为现在Python的搜索路径里包含了utils的父目录,能识别到utils这个包。
方法2:设置PYTHONPATH环境变量
如果你不想每次都在代码里加sys.path.append,可以把/Users/W/dlp/src/03这个路径添加到系统的PYTHONPATH环境变量中:
- 如果你用的是macOS/Linux,可以在终端里执行:
export PYTHONPATH="/Users/W/dlp/src/03:$PYTHONPATH",或者把这句话加到~/.bashrc/~/.zshrc里,永久生效。 - Windows系统可以在“系统属性-环境变量”里添加
PYTHONPATH变量,值设为对应格式的路径即可。
这样每次启动Jupyter Notebook时,Python都会自动把这个路径加入sys.path,第一种导入方式就能直接用了。
方法3:确保utils是合法的Python包
检查/Users/W/dlp/src/03/utils目录下有没有__init__.py文件,如果没有的话,新建一个空的__init__.py文件即可——这是Python识别目录为包的标准标识(虽然Python 3.3+支持无此文件的命名空间包,但添加这个文件能避免很多导入问题)。
内容的提问来源于stack exchange,提问作者wigwagg
相关产品推荐
相关产品推荐

