from .. import error

from .. import error

SystemError: Parent module '' not loaded, cannot perform relative import        [python3]
ValueError: Attempted relative import in non-package        [python2]

前提摘要

假设目录结构如下所示:

main.py
sound/                          Top-level package
      __init__.py               Initialize the sound package
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

equalizer.py文件内容大概如下

# equalizer.py
from . import vocoder
from .. import formats
from ..effects import surround

print('I am in equalizer')

如果使用下述指令编译

python3 equalizer.py 或
python2 equalizer.py

会出现错误

为什么呢?原来在python中,入口文件总是“__main__”,但是当使用equalizer.py作为入口文件的时候,就不能把sound这个文件夹作为一个完整的package来对待,因为你的入口文件在这个包的里面。 所以在equalizer.py中进行相对导入的时候,使用.. 运算符进入上一层的package, 然后发现入口文件就在上一层,所以不会把上一层当作一个package, 这样就会出现上面的这种错误。
python 中只能在package中使用相对导入,不能在用户的应用程序中使用相对导入,因为不论是相对导入还是绝对导入,都是相当于当前模块来说的,对于用户的主应用程序,也就是入口文件,模块名总是__main__, 所以用户的应用程序必须使用绝对导入,而package中的导入可以使用相对导入。
在这里,相对导入 ., .., 应该理解为在:
如果一个目录要想成为一个package的话,那个这个目录中必须包含__init__.py这个文件,最简单的就让这个文件为空就可以了。

在这里,相对导入.,.., 应该理解为在:

符号注释
.在当前的package中进行查找
..在上一层的package中进行查找

不能理解为在当前目录中查找,也不能理解为在上一层目录中查找。

因此,只需要在sound文件夹的外面写一个python文件,将equalizer.py导入便可

# main.py
from sound.filter import equalizer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值