在Jupyter Notebook中导入本地模块失败的技术咨询
嘿,这个问题我可太熟了!没法导入当前工作目录里的本地模块,通常是几个关键细节没注意到,我给你一一梳理:
1. 先确认你的文件结构是否合理
假设你的项目结构是这样的:
my_project/ ├── main.py # 你要运行的主脚本 └── my_module.py # 你想导入的本地模块
这种情况下,main.py里直接写import my_module理论上是可行的,但如果结构更复杂(比如模块在子文件夹里),那你需要给子文件夹加一个__init__.py文件(哪怕是空文件也行),把它变成Python可识别的包:
my_project/ ├── main.py └── utils/ ├── __init__.py └── helper.py
这时候在main.py里可以用from utils import helper来导入。
2. 检查Python的运行路径
有时候你以为自己在模块所在的目录运行脚本,但实际上Python的工作目录并不是这里!比如你在my_project的上级目录运行python my_project/main.py,这时候Python的sys.path里可能没有my_project的路径,导致找不到模块。
解决办法有两种:
- 切换到模块所在的目录再运行脚本:比如先
cd my_project,再python main.py - 在主脚本里手动添加路径:
import sys from pathlib import Path # 添加当前脚本所在目录到Python路径 sys.path.append(str(Path(__file__).parent)) import my_module
3. 千万别和内置/第三方模块重名
这是新手最容易踩的坑!比如你把自己的模块命名为math.py或者requests.py,Python导入的时候会优先找你写的这个模块,而不是系统内置的或者你安装的第三方库,轻则功能异常,重则直接报错找不到模块。
我之前就犯过这错,把模块命名为datetime.py,结果导入datetime的时候一直出问题,排查了半天才发现是自己搞的鬼😂
4. 相对导入的正确姿势
如果你的模块是在一个包内部(比如子文件夹里),想要在包内的脚本之间互相导入,要用相对导入:
比如在utils/helper.py里想导入同目录的tools.py,可以写:
from . import tools
或者从上级目录导入:
from .. import my_module
注意:相对导入只能在作为包的一部分运行时生效,不能直接运行使用相对导入的脚本(比如直接python utils/helper.py会报错,得用python -m my_project.utils.helper这种方式)
内容的提问来源于stack exchange,提问作者Himanshu

