ImportError 使用相对导入报错
ImportError: attempted relative import with no known parent package.相对导入找不到父包
起因
在通过BV1h64y1M7UC学习python的时候,在使用Django构建web应用部分,对使用 . 和 .xxx 导入很感兴趣。
# admin.py
from django.urls import path
from . import views
# views.py
from .models import Product
于是就自己创建了一个例子项目想试一试。可是,实验的时候频繁出现ImportError: attempted relative import with no known parent package.
我就认为是自己对 . 和 .xxx 的含义理解不到位,不全面。就去网上查了查,知道这叫相对导入。并按照这篇文章(3条消息) 【一分钟解决】Python报错ImportError: attempted relative import with no known parent package_jaredyam的博客-CSDN博客的最后一块相对导入部分的介绍,又回到自己的项目试了试。结果还是报这个错。
气急败坏的我又回去运行了admin.py和views.py,结果竟然也报了这个错,我蒙圈了。明明跟着敲的时候也运行了,没有出错呀。
解决
这时我就想不是我对 . 和 .xxx 的使用出错了,而是其他的原因。好在我不小心找到了这篇文章python - ImportError : Attempted relative import with no known parent package - Stack Overflow。经过第一个评论的点播,去看了看python文档相关部分,Python Docs。这才是整个问题的关键!!!
Note that relative imports are based on the name of the current module. Since the name of the main module is always
"__main__"
, modules intended for use as the main module of a Python application must always use absolute imports.[翻译]注意,相对导入是基于当前模块的名称。由于主模块的名称始终为"main",因此打算用作Python应用程序主模块的模块必须始终使用绝对导入。
也就是说当我直接运行admin.py和views.py时,它们就是main模块,它们的__name__属性此时是__main__,此时它们是不能使用相对导入的。
实验验证:当直接运行modA.py的时候,就会出现上面的报错,这时候该模块的name就成main了,找不到父包了。
但是当在main.py中使用package1.modA.p1a()时就成功运行了不会出现任何的报错。
# modA.py
from .modB import p1b
def p1a():
p1b()
print("我是package1的moduleA的方法")
p1a()
# modB.py
def p1b():
print("我是package1的moduleB的方法")
# main.py
import package1.modA
def print_hi(name):
print(f'Hi, {name}')
if __name__ == '__main__':
package1.modA.p1a()
【这个实验参考某篇文章或者视频的,但记不得是哪个了,抱歉】
感悟
主要还是不懂的东西太多了。比如在看文章和视频的时候,我不知道script脚本指的是什么,其实就是main模块。__name__也忘了是干啥的了。所以看很多文章都很吃力。
太多了。比如在看文章和视频的时候,我不知道script脚本指的是什么,其实就是main模块。__name__也忘了是干啥的了。所以看很多文章都很吃力。
以前是选修过python的,不过忘的差不多了,就想通过这6小时的视频BV1h64y1M7UC补一补,希望它可以让我回忆起来。回忆个der,就是重新学了。毕竟是视频短__name__也没讲。还得继续找点项目什么的继续学呀。