我们先创建一个包,所谓的包就是创建一个目录,里面有一个__init__.py文件。
我们在common目录下创建一个mypack的目录,在该目录里面创建下列3个.py文件:
# mypack/__init__.py
print("mypack init")
def init():
print("mypack init function")
# mypack/video.py
print("video module")
def view():
print("video view")
# mypack/audio.py
print("audio module")
def play():
print("play audio")
测试文件 testpack.py:
报错,找不到myapck这个包,因为这个包不在当前源码文件同级目录下,该怎么办呢?
通过sys.path.insert添加查找路径:
# 系统模块
import sys
# print(sys.path)
# 添加模块的查找路径,包的查找路径和模块的是一致的
sys.path.insert(0, "../common/")
然后可以去调用__init__.py里面的初始化函数,但是在运行文件testpack.py发现报错:
导入包里面的模块:
- 我们不能只导入包,那样仍然找不到模块,所以需要导入包里面具体的模块名:
还有一种导入方法:
只引入了包mypack的命名空间,也就是说mypack命名空间下面的所有内容都归到我们当前的主模块__main__的命名空间里面了:
# 还有一种导入方法
from mypack import audio
audio.play()
- 如果我们希望直接把整个audio也引进命名空间的话,该怎么做呢?
# 引入包和模块的命名空间
# from mypack.audio import *
from mypack.audio import play
play()
要注意*星号:
from mypack import *
这种方式不导入包的全部模块,也就是不会导入video、audio,这种方式只导入了__init__.py里面所有的函数和成员。
- 那如果我想直接把包里面的所有模块、该引用的全部引用了,该怎么做呢?
需要在__init__.py当中定义一个变量__all__,然后在Python执行到from mypack import *这里的时候,才能知道要导入哪些模块:
# mypack/__init__.py
print("mypack init")
# import * 的时候需要载入的模块
__all__ = ["audio", "video", "openGL"]
def init():
print("mypack init function")
修改testpack.py文件如下:
# 子包 mypack/sub/pydir.py
def pydir():
print("pydir")
包里面包含多个模块,模块里面又包含了多个函数、类和变量。
包 -> 模块 -> 函数、类、变量