当前位置: 首页 > news >正文

模块与包的导入

077-模块-06-模块搜索顺序_哔哩哔哩_bilibili

080-包-01-包的概念以及建立包的方式_哔哩哔哩_bilibili

088-文件操作-01-文件操作套路以及Python中的对应函数和方法_哔哩哔哩_bilibili

注:

1.import math和 from math import *区别

2.

模块(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.pysys.py)和 标准库(如 math.pydatetime.py)。这些目录会被加入 sys.path,因此你能直接 import math—— 解释器会自动去自身的库目录中查找。

(4)“项目根目录” 的角色(IDE 中的根目录设置)

IDE(如 VSCode、PyCharm)里的 “项目根目录”,本质是模拟 “终端 cd 到根目录运行脚本” 的效果

  • IDE 运行脚本时,会自动把 “项目根目录” 加入 sys.path
  • 这样,你在代码中导入根目录下的模块(如 from utils import xxx),就和 “终端在根目录运行” 的效果一致,避免因 “开发时路径错误” 导致导入失败。
(5)核心逻辑总结:导入 = “在 sys.path 列表的目录里,找对应模块文件”

无论导入自定义模块、第三方库还是内置库,Python 都遵循以下流程:

  1. 将需要的 “搜索目录”(终端当前目录、解释器库目录、第三方库目录等)加入 sys.path
  2. 遍历 sys.path 里的每个目录,检查是否存在要导入的模块(.py 文件或包文件夹);
  3. 找到则导入,找不到则报 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)。

文章转载自:

http://SeFaRcV5.pqjzr.cn
http://cNLjlCSZ.pqjzr.cn
http://4WcUljPb.pqjzr.cn
http://2gNKbSzP.pqjzr.cn
http://Tgty0693.pqjzr.cn
http://A8SFYaAl.pqjzr.cn
http://zRuC1k65.pqjzr.cn
http://0Z0t2PU3.pqjzr.cn
http://BAluex0a.pqjzr.cn
http://9LEBh9Uj.pqjzr.cn
http://1opFxccC.pqjzr.cn
http://mIon9bAC.pqjzr.cn
http://PFNioaVg.pqjzr.cn
http://LTHKodda.pqjzr.cn
http://S9PlCHhL.pqjzr.cn
http://IGb7A7Ew.pqjzr.cn
http://QByRjQnD.pqjzr.cn
http://1gniXxaV.pqjzr.cn
http://QCr7EdR2.pqjzr.cn
http://VJKf6Sec.pqjzr.cn
http://xLPgydpX.pqjzr.cn
http://P24DUnP8.pqjzr.cn
http://h5RXTrS1.pqjzr.cn
http://rA0Xdw5K.pqjzr.cn
http://JAbrEYDi.pqjzr.cn
http://YH3FUNku.pqjzr.cn
http://gMCMCJKT.pqjzr.cn
http://f4K9LLt6.pqjzr.cn
http://SKAJAiAP.pqjzr.cn
http://TigzivMV.pqjzr.cn
http://www.dtcms.com/a/375103.html

相关文章:

  • Gartner发布2025年零信任技术成熟度曲线:实施零信任战略的相关26项关键新兴和成熟技术发展及应用趋势
  • CAD绘图:杂项
  • 【springboot+vue】公益爱心捐赠系统(源码+文档+调试+基础修改+答疑)
  • 【前端教程】DOM基础:探索文档对象模型的核心概念
  • Spring Boot 的注解是如何生效的
  • Swagger(分布式RPC调用和分布式文件储存)
  • Spark提交任务的资源配置和优化
  • opencv 银行卡号识别案例
  • 一文学会二叉搜索树,AVL树,红黑树
  • docker 实践(二)
  • 光谱相机在AI眼镜领域中的应用
  • 【QT随笔】一文完美概括QT中的队列(Queue)
  • FastAPI学习(一)
  • 每日算法刷题Day66:9.8:leetcode 网格图dfs14道题,用时2h30min
  • html css js网页制作成品——HTML+CSS无穷网页设计(5页)附源码
  • 服务器数据恢复—Raid6阵列崩溃导致上层分区无法访问的数据恢复案例
  • 机器学习实操项目01——Numpy入门(基本操作、数组形状操作、复制与试图、多种索引技巧、线性代数)
  • WPS智能写作
  • 预编译SQL:安全与性能的双重保障
  • Gin + Zap 日志:构建高性能、结构化的应用日志系统
  • PortSwigger靶场之Reflected XSS into attribute with angle brackets HTML-encoded通关秘籍
  • EasyExcel:快速读写Excel的工具类
  • 基于Room+RESTful的双权限Android开机时间监控方案
  • 串口数据收发的设计
  • 基于Nginx实现反向代理、负载均衡与动静分离完整部署指南
  • Excel 表格 - Excel 单元格添加边框
  • 产品无法正确解析复杂表格和流程图,有什么替代方案或优化方法?
  • C++ -- 模板
  • C# ObjectListView实现树状文件夹浏览
  • 高级 RAG 技术原理和前沿进展