python import 情况概览

init 用作init某个文件夹成为python model时
在__init__.py
import 和该文件同级的某个py文件不成功

而__init__ 用作普通的py文件脚本执行的时候
import 和该文件同级的某个py文件成功

相对引用只能用在from ... import ...上
import .model as 语法错误

作为普通py文件脚本执行的时候,使用相对引用
from .model import * 不成功,不能在前面加 "."
作为普通的py文件import 同级文件.py 时
只能用绝对引用 即import module.py 用 from .module import 出错

/
b/
bb.py
a/
aa.py
c.py
作为普通bb.py文件 import 与其父目录b同级的目录a下的aa.py文件时
import a.aa 不成功
然而如果在与其父目录b同级的c.py文件 里 import b.bb.py文件时
b.bb.py文件里的import a.aa 语句能够成功执行。

大致明白了,在c.py文件里执行b.bb.py文件里的 import语句等价于在
c.py文件里执行 import语句,所以能够import a.aa 成功

import 时,
先执行与 module.py父目录,也就是与其同级下的__init__文件
再执行各个模块里的import 语句

相对引用的实质是:
import .module <=> import name.model

所以当在同级的py文件里调用 import .module 时,实际上调用的是
import main.module 而 main 不是一个模块的名称,所以
同级相对调用会报错:
"ModuleNotFoundError: No module named 'main.module: main is
not a package"

而当该py文件被其他文件调用时,__name__被替换成了模块名称,所以那个
模块下的import .module可以被执行成功

总结:
1.该模块被其他模块调用时,该模块下可以使用 相对导入
import .module语句
2.当该模块自身执行时,不能使用相对导入, 只能使用import module
3.该模块里对于与其父目录同级目录下的py文件调用:
import a.aa
如果该模块自身执行则该语句执行失败
如果该模块被与其父目录同级的c.py文件调用时,则该语句执行成功
其等价于在c.py中执行 import a.aa
4.Attempted relative import beyond top_level packages

init.py文件作为init某个文件夹的时候,只能用相对引用
from .model import *
用绝对引用 import model 不成功。

posted @ 2019-03-05 12:09  Simplexity  阅读(185)  评论(0编辑  收藏  举报