Python 相对导入attempted relative import beyond top-level package

博客围绕Python中ValueError: attempted relative import beyond top-level package错误展开。介绍了不同层次包目录下相对导入语法,分析了run.py和main.py作为顶层模块执行导入时,各模块__name__的变化及相对导入作用域,还给出避免该错误的示例。

ValueError: attempted relative import beyond top-level package

假设有如下层次包目录

 1 project/
 2     __init__.py
 3     mypackage/
 4         __init__.py
 5         A/
 6             __init__.py
 7             spam.py     #* print("In spam") *#
 8             grok.py     #* print("In grok") *#
 9             C/
10                 __init__.py
11                 hello.py    #* print("In hello") *#
12         B/
13             __init__.py
14             bar.py      #* print("In bar") *#
15         run.py
16     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 (run.py当作顶层执行模块,即 python 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')
 

 

转载于:https://www.cnblogs.com/linkenpark/p/10909523.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值