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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:33