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