Python 包和模块

First Post:

Last Update:

概念

  • 模块
    • 简单来讲, 模块是单独的 py 文件
    • 一个有层次的文件命令结构, 内部可以包含多个模块和子包
    • 完成一定功能代码的集合
    • 可以是模块, 也可以是包

包和模块

创建

模块就是 .py 文件

的创建, 需要在目录中创建一个名为 __init__.py 文件1
一般都建议创建 __init__.py 文件

__init__.py作用:

  • 导入包的时候, 会自动执行 __init__.py
    可以做一些包的预操作
  • 导入子包
1
2
# 导入包内模块
.模块名

信息

dir() 方法, 返回模块拥有的 API, 具体细节网上查

__file__ 特殊变量, 储存的是模块的绝对路径

获取模块信息, 例:

1
2
3
4
5
6
7
import os

# 模块绝对路径
print(os.__file__)

# 查看模块的API
print(dir(os))

导入

模块导入的方法并不存在内存消耗的区别

模块导入时, 有其检索顺序

  • 第一次导入
    • 第一级, 按内置模块顺序检索
    • 第二级
      • sys.path, 路径列表
      • 追加路径, …
  • 第二次导入

追加路径:

1
2
3
4
import sys

# 将路径追加至路径列表
sys.path.append("C:\\Desktop\\example\\")

常规导入

模块导入

1
2
3
4
5
6
7
8
# 导入单个模块
import <模块名>

# 导入多个模块
import <模块1>, <模块2>

# 将模块指向变量
import <模块> as <变量名>

包内模块导入

1
2
3
import <包名>.<模块名>

...

from 语句

1
2
from <模块名> import <模块API>


导入场景

局部导入

1
2
3
4
5
6
# os模块仅属于函数内的命名空间
def example():
import os

# 函数外无法访问
print(os.path)

循环导入

在模块 A 导入了模块 B
又在模块 B 中导入模块 A
引起循环导入

注: import 语句只会运行一次


可选导入

会遇到两个功能相近的包, 想要有个备选包
例如: request 库和 aiohttp

1
2
3
4
5
6
7
8
9
10
try:
import <包1>
except ModuleNotFoundError:
import <包2>

# 或
try:
import <包1> as bao
except ModuleNotFoundError:
import <包2> as bao

包内导入

包内导入分绝对导入2相对导入

  • 绝对导入:
    通过路径列表导入
  • 相对导入:
    通过 . 指代相对路径

绝对导入:

1
2
3
# 例
import os
from os import path

相对导入:

1
2
3
4
# "." 当前目录
# ".." 上级目录
import .my_module
from .my_module import method

  1. 1.python 版本 >= 3.3 可以不创建
  2. 2.适用于 python >= 3.0