Python-模块篇(模块介绍篇)

1、模块介绍

Python模块(Module)是Python代码组织和重用的基本单元,本质上是一个以.py结尾的Python源文件。

模块中包含了变量、函数、类以及可执行代码,通过模块可以将功能逻辑相关的代码集中封装,实现代码的拆分与复用,同时避免命名冲突,使项目结构更清晰。

核心作用:

  • 代码复用:编写好的模块可以在不同的程序中被导入和调用,避免重复编写相同代码。
  • 命名空间管理:不同模块中的同名变量或函数互不干扰,避免命名冲突。
  • 代码组织:将相关功能(如数学计算、文件操作、数据处理)拆分到不同的文件中,提高代码的可读性和可维护性,便于团队协作。

1.1 包(Package)

  • 定义:一个包含"__init__.py"文件的文件夹
  • __init__.py作用:对包的导入行为进行控制,简化导入路径,以及实现包级别的初始化  
# __init__.py
VERSION = "1.0.0" #定义版本号、预加载配置、连接数据库池等

#from package import *:导入__all__中的模块
__all__ = ["module1""module2"] 

1.2 导入模块( import)

  • 导入时会自动执行其中的代码,比如__init__.py
    • 访问模块时才会触发导入
    • 只会被真正导入并执行一次。后续的导入都直接从缓存 sys.modules 中获取
  • 导入的模块会被编译成.pyc文件,存放在__pycache__文件夹中(提升性能)
  • 建议导入顺序:标准库 → 第三方库 → 本地应用/库。每组之间用空行分隔。
  • 循环导入问题( A 导入 B,B 又导入 A):最佳解决方法是重构代码,将共同依赖的部分提取到一个新的独立模块中。
导入方式 使用方式
import [包名].模块名1 [as 别名1], 模块名2 [as 别名2]

[包名].模块名1.成员名

[包名].模块名2.成员名

from 包名 import 模块名1 [as 别名1] 模块名1.成员名
from [包名].模块名 import 成员名1 [as 别名1] 成员名1(不推荐,容易冲突)
from 模块名 import * 成员名(不推荐,容易冲突)
from .. import 模块名

相对导入(不推荐,容易出错)

1、1个点表示当前目录,2个点表示上层目录

1.3 安装模块(pip)

pip 是 Python 的官方包管理工具(全称“Package Installer for Python”),用于查找、下载、安装、升级和卸载 Python 第三方库(包)。

  • 更换pip镜像:pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple
    • -i选项:指定安装源
    • --trusted-host:信任源
    • ==, >=, <=, >, <:指定版本号
  • 查看已安装的包:pip list
  • 安装指定版本的模块:pip install -r requirements.txt
    • 安装requests:pip install requests
    • 更新requests:pip install --upgrade requests
    • 卸载requests:pip uninstall requests
  • 导出已安装模块及版本:pip freeze > requirements.txt

1.4 ModuleNotFoundError原因及解决办法

  • 原因:导入模块时会在sys.path中找,找不到就报错
  • sys.path:一个目录列表,包含执行程序所在目录、Python安装目录以及PYTHONPATH环境变量中的每个目录
  • 添加目录到sys.path
    • sys.path.append("模块路径")
    • PYTHONPATH环境变量配置目录

1.5 跨包调用

main.py导入内容:

from package_a import temp_a

from package_a.util_a import util_a_1

from package_b import temp_b

from package_b.util_b import util_b_1

运行main.py,运行Pass  

#项目结构
main.py
package_a #包a
--util_a       #包util_a
----util_a_1.py
--temp_a.py

package_b #包b
--util_b       #包util_b
----util_b_1.py
--temp_b.py

temp_b.py导入内容:

from util_b import util_b_1

运行temp_b.py,运行Pass

运行main.py,出现ModuleNotFoundError: No module named 'util_b'

1、运行main.py时,导入temp_b,并且执行temp_b的导入

2、temp_b.py 此时所在目录为 main.py运行时所在的目录

3、在main.py所在目录执行导入from util_b import util_b_1就会报错

修改:from package_b.util_b import util_b_1

再次运行main.py:运行Pass

temp_b.py导入内容:

from package_b.util_b import util_b_1

 运行temp_b.py,

出现ModuleNotFoundError: No module named 'package_b'

1、默认只能导入当前所在目录及下层目录的,不能导入上层目录的

2、解决:sys.path.append("package_b的上层目录")

temp_b.py万能导入内容:

try:

  from util_b import bUtil

  print("temp3.py直接运行执行导入")

except Exception as e:

  from package_b.util_b import bUtil

  print("temp3.py被main.py运行执行导入")

__init__.py预导入子模块、简化路径:

#在 package_a/__init__.py 中

from .util_a import util_a_1

main.py中使用:from package_a import util_a_1

替代:from package_a.temp_a import util_a_1

更推荐方案1:将项目根目录永久添加到 PYTHONPATH 环境变量中

更推荐方案2:在项目入口文件(如 main.py)的最上方统一添加

--sys.path.append(os.path.dirname(__file__))

优点:所有模块都可以统一使用绝对导入(如 from package_b.util_b import...

posted @ 2026-07-03 14:46  Fēngwèi  阅读(4)  评论(0)    收藏  举报