Django项目中为何from . import views有效但import views报错
核心原因
你的认知存在两个典型误区:
import foo仅会在sys.path明确列出的目录中搜索模块,默认不会自动包含当前模块所属的包目录,你之前认为“搜索范围包含当前包”的结论不成立。- 绝对导入(不带前导点的
import语句)和相对导入(带前导点的导入语句)的搜索逻辑完全独立:绝对导入仅参考sys.path的路径列表,相对导入仅参考当前模块的文件系统位置,和sys.path没有关联。
Django场景的具体表现
Django通过manage.py启动项目时,会自动把manage.py所在的项目根目录加入sys.path。你的项目根目录下只有mysite、myapp两个子目录,没有独立的views.py文件,所以执行import views时,Python遍历sys.path的所有路径都找不到目标模块,自然抛出ModuleNotFoundError。
而from . import views属于相对导入,语句中的.指代当前模块myapp/urls.py所属的myapp包,Python会直接在myapp目录下查找views.py,所以可以正常导入。
补充说明
如果你想用绝对导入实现同样的效果,可以使用from myapp import views写法:因为myapp目录在项目根目录下,根目录已经被加入sys.path,所以这种写法也是合法的。
内容的提问来源于stack exchange,提问作者Raskolnikov
相关产品推荐
相关产品推荐

