Django中settings.py无法导入本地模块,为何报错?
Django模块导入失败的原因及解决办法
问题场景
你的项目目录结构如下:
git/src ├── myproject │ ├── settings.py │ ├── mysharedlib.py │ └── urls.py └── www ├── myotherlib.py ├── urls.py └── views.py
在settings.py中执行import mysharedlib时抛出异常:
ModuleNotFoundError: No module named 'mysharedlib'
从views.py导入myotherlib时也出现同类错误。
核心原因
Python的模块查找依赖sys.path列表,Django启动时默认会把项目根目录(即git/src)加入sys.path。但你尝试导入的mysharedlib、myotherlib分别在myproject、www子目录下,直接用import 模块名的绝对导入方式,Python会在sys.path的顶级目录中查找,找不到对应模块,因此报错。
解决方法
方法1:使用相对导入(推荐)
同目录模块间用相对导入,符合Python包设计规范:
- 在
settings.py中导入mysharedlib:from . import mysharedlib - 在
views.py中导入myotherlib:from . import myotherlib
方法2:使用完整路径的绝对导入
指定模块所在的完整包路径导入:
- 在
settings.py中:import myproject.mysharedlib as mysharedlib - 在
views.py中:import www.myotherlib as myotherlib
方法3:手动添加目录到sys.path(不推荐)
通过代码将模块所在目录加入Python查找路径,仅作临时方案(会破坏包结构规范):
在settings.py开头添加:
import sys from pathlib import Path # 将当前文件所在目录(myproject)加入sys.path current_dir = Path(__file__).resolve().parent sys.path.append(str(current_dir))
之后即可正常使用import mysharedlib。
内容的提问来源于stack exchange,提问作者spraff
相关产品推荐
相关产品推荐

