30、python导入包和子包

我们先创建一个包,所谓的包就是创建一个目录,里面有一个__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")

在这里插入图片描述

包里面包含多个模块,模块里面又包含了多个函数、类和变量。

包 -> 模块 -> 函数、类、变量

猜你喜欢

转载自blog.csdn.net/zhaopeng01zp/article/details/109303320