Python 相对导入

Posted rons

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 相对导入相关的知识,希望对你有一定的参考价值。

假设有如下层次包目录

 
project/
    __init__.py
    mypackage/
        __init__.py
        A/
            __init__.py
            spam.py     #* print("In spam") *#
            grok.py     #* print("In grok") *#
            C/
                __init__.py
                hello.py    #* print("In hello") *#
        B/
            __init__.py
            bar.py      #* print("In bar") *#
        run.py
    main.py
 
相对导入语法
 
from . import module
from .. import module
from ... import module
 
 
相对导入与模块__name__有关
  • run.py作为顶层模块执行导入A.spam时
    • run.py的__name__ 等于 __main__
    • spam.py的__name__ 等于 A.spam
    • A成为顶层的包,所以相对导入最多?只能访问到A,A之外的层次结构是不可见的
  • main.py作为顶层模块执行导入mypackage.A.spam是
    • main.py的 __name__ 为 __main__
    • spam.py的__name__ 为 mypackage.A.spam
    • mypackage成为顶层包,相对导入作用域扩大,B/包对spam.py可见
 
相对导入只适用于包中的模块,顶层的模块中将不起作用
  • 如果将run.py当作顶层执行模块
    • A/ 和 B/ 将成为  toplevel package 顶层包 A/中的模块不能用相对导入来导入B/包中的模块,因为不能越过顶层包。
    • A/、B/ 包中的目录可以导入本包中及以下的模块
  • 如果将main.py当作顶层执行模块
    • mypackage/成为顶层包,A/可以访问到B/包,不会出现 ValueError: attempted relative import beyond top-level package
例子
‘‘‘run.py
 
import A.spam
 
‘‘‘
-----------------------------------
‘‘‘spam.py
 
from . import grok      # ok
from .C import hello    # ok
from ..B import bar     # !Err 
                                                           —— ValueError: attempted relative import beyond top-level package
print(‘In spam‘) 
 
‘‘‘
‘‘‘main.py
 
import mypackage.A.spam
 
‘‘‘
-----------------------------------
‘‘‘spam.py
 
from ..B import bar     # ok
print(‘In spam‘)
 
‘‘‘
 

 

以上是关于Python 相对导入的主要内容,如果未能解决你的问题,请参考以下文章

详解Python中的相对导入和绝对导入

Python:禁用相对导入[重复]

Python 包的相对导入讲解

Python中的“尝试相对导入超出***包”错误意味着啥?

Python 导入相对路径

python的相对路径导入问题