python相对导入

https://www.cnblogs.com/rons/p/9074979.html

绝对导入的格式为 import A.B 或 from A import B,相对导入格式为 from . import B 或 from …A import B,.代表当前模块,…代表上层模块,…代表上上层模块,依次类推。
https://blog.csdn.net/u013571243/article/details/77734346

存在相对导入语句的模块,是不能直接运行的。
https://www.cnblogs.com/gaowengang/p/8543840.html
例如,对于如下层次结构的 Digital.py 文件,

#!/usr/bin/env python
# -*- coding: utf-8 -*-
##############################################################################
# Purpose: to demo underlayer import upperlayer.
##############################################################################
#
#      \PHONE
#      │  common_util.py   -> setup()
#      │  __init__.py
#      │
#      ├─Fax
#      │      G3.py        -> bar()
#      │      __init__.py
#      │
#      ├─Mobile
#      │      Analog.py    -> foo()
#      │      Digital.py
#      │      __init__.py
#      │
#      ├─Pager
#      │      Page.py
#      │      __init__.py
#      │
#      └─Voice
#              Isdn.py
#              __init__.py
#
##############################################################################

from .Analog import foo          # ValueError: Attempted relative import in non-package
from ..common_util import setup  # ValueError: Attempted relative import in non-package
from ..Fax.G3 import bar         # ValueError: Attempted relative import in non-package

if __name__ == '__main__':

    foo()
    setup()
    bar()

如果上述代码直接运行,将导致 ValueError 异常,

ValueError: Attempted relative import in non-package

这是因为:一个模块直接运行,Python 认为这个模块就是顶层模块,不存在层次结构,所以找不到其它的相对路径。

而要正确运行,就要显式的指定路径,如下,

C:\workspace\X_python>python -m Phone.Mobile.Digital
This is foo() from Phone.Mobile.Analog
This is setup() from Phone.common_util
This is bar() from Phone.Fax.G3

当然,我们一般不会直接运行包内的某个模块,这里只是做个说明。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值