包和模块
包:包里面可以有多个子包,子包里面又可以有多个模块;
模块:一个.py文件就是一个模块。
一般包目录下都会定义__init__.py ,在__init__.py中存在一个叫做 __all__的列表变量,在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入;如果__all__没有定义,那就不会导入任何模块。
一种可能的包的结构(sound包):
sound/ 顶层包
__init__.py 初始化 sound 包
formats/ 文件格式转换子包
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 声音效果子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ filters 子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
记录一些遇到的问题,
假设现在有这样一个包:

包
在 ani 包中的 cat 模块里有say()函数定义,如何在tree模块和peo模块中进行调用呢,或者说如何导入cat模块?
peo模块导入cat模块:
# 1
import ani.cat
ani.cat.say()
cat.say() # 错误!
# 2
import ani.cat as cat
cat.say()
# 3
from ani.cat import say
say()
# 4
from ani import cat
cat.say()
tree模块导入cat模块:
# 错误的相对引用
from ..ani import cat # 错误!
cat.say()
ImportError: attempted relative import with no known parent package
from ani import cat # 正确
cat.say()