077-模块-06-模块搜索顺序_哔哩哔哩_bilibili
080-包-01-包的概念以及建立包的方式_哔哩哔哩_bilibili
088-文件操作-01-文件操作套路以及Python中的对应函数和方法_哔哩哔哩_bilibili
注:
1.import math和 from math import *区别
模块(Module)
-
**本质**:以 `.py` 结尾的**单个文件**,包含Python代码(函数、类、变量等)。
-
**作用**:将代码拆分到不同文件中,避免代码冗余,方便复用和维护。
包(Package)
在python里,包就是库
-
**本质**:**有层次的文件目录结构**(即文件夹),用于组织多个模块和子包。
-
**核心特征**:包的根目录下必须包含一个 `init.py` 文件(可以为空),用于标识该目录是一个包。
都可以通过import进行调用
3.学会查看库、函数的官方文档了解其用法、细节
python main.py就是让运行main.py时,能让里面的包、模块成功导入
4.导入自定义库 / 模块的常见方式
Python 导入自定义模块(如自己编写的 .py
文件或包),需根据模块的位置关系 和使用需求选择语法,核心有以下 4 类:
(1)直接导入整个模块
适合需要调用模块内多个函数 / 类的场景,调用时需加「模块名。对象名」前缀。
示例(假设 circle.py
含 calculate_area
和 calculate_circumference
两个函数):
# main.py
import circle # 导入整个 circle 模块
radius = 5
area = circle.calculate_area(radius) # 通过「模块名.函数名」调用
circum = circle.calculate_circumference(radius)
print(area, circum)
(2)从模块导入 "指定对象"
适合仅需模块内部分函数 / 类的场景,调用时无需加模块名前缀,更简洁。
# main.py
from circle import calculate_area # 只导入 calculate_area 函数
radius = 5
area = calculate_area(radius) # 直接调用函数,无需写 circle.
print(area)
也可一次性导入多个对象(用逗号分隔):
from circle import calculate_area, calculate_circumference
(3)导入模块并 "起别名"
用于简化长模块名 或解决命名冲突(比如模块名与变量 / 其他模块重名)。
示例(模块名过长时):
import my_very_long_module_name as mvlm # 给模块起别名 mvlm
mvlm.some_function() # 等价于 my_very_long_module_name.some_function()
也可给导入的对象起别名
from circle import calculate_area as calc_area
area = calc_area(5)
(4)导入 "包" 中的模块(包是含 __init__.py
的文件夹)
复杂项目中,模块常放在 "包"(带 __init__.py
的文件夹)里,需指定 "包路径" 导入。
假设目录结构:
project/
├── main.py
└── utils/
├── __init__.py # 空文件,标记 utils 是"包"
└── geometry.py # 含 calculate_area 函数
导入方式:
# 方式1:导入包内的模块,再调用模块内对象
from utils import geometry
area = geometry.calculate_area(5)
# 方式2:直接导入包内模块的对象
from utils.geometry import calculate_area
area = calculate_area(5)
5.导入库 / 模块的核心逻辑:Python 的 "模块查找路径"(与根目录、解释器 / 终端目录的关系)
Python 导入模块时,不是随机搜索 ,而是严格按照「预定义的路径列表」查找 ------ 这个列表存于 sys.path
中。理解 sys.path
,就能明白 "根目录、解释器目录、终端目录" 如何影响导入。
(1)sys.path
是什么?
sys.path
是一个列表,存储着 Python 解释器会搜索模块的所有目录路径 。执行 import xxx
时,解释器会依次遍历 sys.path
里的每个目录,寻找名为 xxx.py
(或包 xxx/
)的模块。
可通过代码打印 sys.path
查看路径:
import sys
print(sys.path)
输出大致包含以下几类路径(不同环境略有差异):
[
"终端运行脚本时的"当前目录"", # 关键!终端所在目录会被优先加入
"Python 解释器的内置库目录", # 如 .../python3.10/lib(存放 os、sys 等内置模块)
"第三方库安装目录", # 如 .../site-packages(存放 pandas、numpy 等第三方库)
...
]
(2)"终端的目录" 如何影响导入?
当你在终端中运行 python main.py
时,Python 会自动把 "终端当前所在的目录" 加入 sys.path
的最前面 。这就是为什么 "终端需要 cd
到项目根目录再运行脚本"------ 这样项目根目录下的自定义模块(如 circle.py
)才能被找到。
举个例子:
- 终端当前目录是
/home/user/project/
(项目根目录,含main.py
和circle.py
); - 运行
python main.py
,Python 会把/home/user/project/
加入sys.path
; - 当
main.py
执行import circle
时,解释器会在sys.path[0]
(即/home/user/project/
)中找到circle.py
,成功导入。
(3)"解释器的目录" 有什么用?
Python 解释器的安装目录(如 /usr/local/bin/python3
所在层级)中,包含 Python 内置库 (如 os.py
、sys.py
)和 标准库 (如 math.py
、datetime.py
)。这些目录会被加入 sys.path
,因此你能直接 import math
------ 解释器会自动去自身的库目录中查找。
(4)"项目根目录" 的角色(IDE 中的根目录设置)
IDE(如 VSCode、PyCharm)里的 "项目根目录",本质是模拟 "终端 cd
到根目录运行脚本" 的效果:
- IDE 运行脚本时,会自动把 "项目根目录" 加入
sys.path
; - 这样,你在代码中导入根目录下的模块(如
from utils import xxx
),就和 "终端在根目录运行" 的效果一致,避免因 "开发时路径错误" 导致导入失败。
(5)核心逻辑总结:导入 = "在 sys.path
列表的目录里,找对应模块文件"
无论导入自定义模块、第三方库还是内置库,Python 都遵循以下流程:
- 将需要的 "搜索目录"(终端当前目录、解释器库目录、第三方库目录等)加入
sys.path
; - 遍历
sys.path
里的每个目录,检查是否存在要导入的模块(.py
文件或包文件夹); - 找到则导入,找不到则报
ModuleNotFoundError
。
示例:"终端目录不对导致导入失败"
假设目录结构:
project/
├── main.py
└── circle.py
main.py
中含 import circle
。
- 情况 1 :终端
cd
到project/
,运行python main.py
→ 成功(project/
在sys.path
中,能找到circle.py
)。 - 情况 2 :终端在
project/
的父目录(如/home/user/
),直接运行python project/main.py
→ 失败(此时sys.path
的 "当前目录" 是/home/user/
,不含circle.py
,会报ModuleNotFoundError
)。