Python模块与包(八)

模块

模块就是 Python 中的“工具包”。
每一个 .py 文件都可以视为一个模块,可以包含:

  • 函数
  • 变量
  • 可执行代码

模块的作用:

让功能拆分更明确,方便复用、管理和维护。


什么是模块

PDF 第 1 页原文说明:

一个 Python 文件,以 .py 结尾,就是一个模块。

模块内可以定义函数、类、变量,也可以包含可执行代码。

模块让我们可以在多个文件之间复用功能,避免重复开发。


模块的导入语法

PDF 展示了模块导入的 5 种常见写法:

import 模块名
from 模块名 import 功能
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能 as 别名

下面逐一解释每种方式。


用法一:import 模块名

语法:

import 模块名

使用模块内容:

模块名.功能名()

PDF 示例(导入 time 模块):

import time
print("开始")
time.sleep(10)
print("结束")

页面截图中(PDF 第 1 页)展示的是执行结果:

开始
(等待10秒)
结束

用法二:from 模块名 import 功能名

语法:

from 模块名 import 功能名

使用时无需写模块名前缀:

功能名()

PDF 示例(导入 sleep 方法):

from time import sleep
print("开始")
sleep(10)
print("结束")

效果与用法一一致。


用法三:import 模块名 as 别名 / from 模块名 import 功能 as 别名

语法:

import 模块名 as 别名
别名.功能名()

from 模块名 import 功能名 as 别名
别名()

PDF 示例:

import time as tt
tt.sleep(10)

from time import sleep as sl
sl(10)

别名通常用于:

  • 模块名太长
  • 避免与当前文件变量名冲突

**用法四:from 模块名 import ***(全部导入)

语法:

from 模块名 import *

表示导入该模块所有可用功能。

示例(PDF 第 2 页):

from time import *
sleep(10)

注意:

  • 不推荐在大型项目中使用 *,容易造成命名冲突
  • 后面会讲到使用 __all__ 控制可导入的功能

导入模块的小结(PDF 第 3 页)

PDF 总结:

  • import 可以省略 as
  • from 可以省略 as
  • 通过 模块.功能() 或直接 功能() 来使用
  • 模块导入应写在文件开头位置(PEP8 规范)

自定义模块

PDF 第 3~4 页说明:

每一个 Python 文件本身就是一个模块,只要在另一个文件中 import 它,就能使用其内容。

示例:

test_3.py(自定义模块)

def add(x, y):
    return x + y

def sub(x, y):
    return x - y

test_04.py(使用模块)

import test_3

res_add = test_3.add(5, 3)
print(res_add)

res_sub = test_3.sub(5, 3)
print(res_sub)

PDF 截图(第 4 页)显示运行结果:

8
2

自定义模块的注意事项

在多个 Python 文件之间相互导入时,需要注意模块的命名问题、执行入口标识、以及限定可导入内容等事项。
PDF 提供了三个重点:入口判断 __main__、命名冲突、__all__ 控制导入功能。


自定义模块的执行入口:__main__

Python 中每个文件都可以直接运行,也可以作为模块被其他文件导入。

两种方式的区别:

  • 直接运行文件 → 对应模块的 __name__ == "__main__"
  • 被其他文件 import → 对应模块的 __name__ == 文件名

因此,若想让某段代码只在“直接运行”时执行,而不在 import 时执行,可写:

if __name__ == "__main__":
    print("此代码只会在直接运行本文件时执行")

PDF 示例(页面 4):

test_3.py:

def add(x, y):
    print(f"{x} + {y} = {x + y}")

def sub(x, y):
    print(f"{x} - {y} = {x - y}")

if __name__ == "__main__":
    print("我是主执行入口")
    add(5, 3)
    sub(5, 3)

运行 test_3.py → 输出:

我是主执行入口
5 + 3 = 8
5 - 3 = 2

但当另一个文件 import test_3 时:

import test_3

test_3 中 if 块不会执行。


模块命名冲突问题

PDF 第 5 页特别强调:
自定义模块名不能与 Python 内置模块名相同,否则会造成覆盖。

例如:

如果你创建一个名为 time.py 的文件:

time.py  ← 你写的
time 模块 ← Python 内置标准库

然后执行:

import time

Python 会优先导入你写的 time.py,而不是官方的 time 模块,导致各种功能无法使用。

PDF 图示的错误示例(文字化):

AttributeError: module 'time' has no attribute 'sleep'

解决方案:

  • 不要使用 Python 标准库模块名命名你的文件
  • 避免使用过于通用的名称(如 math、os、sys 等)

控制模块被导入的内容:__all__

当使用:

from 模块 import *

时,理论上模块中的所有“非下划线开头”的功能都会被导入。

但有时我们希望控制哪些内容可以被 * 导入。

可以在模块内定义:

__all__ = ["add", "sub"]

表示:

  • 只允许 add、sub 被 from 模块 import * 导入
  • 其他功能不允许被导入

PDF 示例(页面 6):

test_3.py:

__all__ = ["add"]

def add(x, y):
    print(f"{x} + {y} = {x + y}")

def sub(x, y):
    print(f"{x} - {y} = {x - y}")

test_04.py:

from test_3 import *
add(5, 3)
sub(5, 3)

运行结果(PDF 截图文字化):

5 + 3 = 8
NameError: name 'sub' is not defined

原因:
sub 不在 __all__ 中,所以不会被导入。


注意事项总结

  • __main__ 用于区分脚本运行 VS 模块被导入
  • 模块名不要与标准库冲突
  • 使用 __all__ 控制通配符导入内容

内置模块与第三方模块

Python 为我们提供了三类模块:

  1. 内置模块(Python 自带)
  2. 第三方模块(需要安装)
  3. 自定义模块(我们自己写的 .py 文件)

本章介绍 PDF 中的前两类:内置模块与第三方模块。


内置模块

内置模块无需安装,Python 自带即可使用,例如:

  • time
  • random
  • math
  • os
  • sys

直接 import 即可。


示例:random 模块

PDF 第 7 页示例:

# 随机整数
import random
num = random.randint(0, 10)
print(num)

输出的数字在 0~10 之间随机变化。


random.randint()

语法:

random.randint(a, b)

含义:

  • 生成一个 a <= n <= b 的随机整数,可用于:
    • 随机验证码
    • 随机抽奖
    • 随机取样
    • 游戏随机事件

第三方模块

PDF 第 7~8 页对第三方模块进行了说明:

第三方模块不属于 Python 官方,需要通过 pip 安装后才能使用。

第三方模块通常由社区、企业、个人开发,例如:

  • requests(网络请求)
  • numpy(科学运算)
  • pandas(数据分析)
  • matplotlib(绘图)

pip 安装模块

PDF 图示说明了 pip 的三种用法(完整文字化如下):

方式一(推荐):直接安装到当前 Python 环境

pip install 模块名

示例:

pip install requests

若成功,会出现提示:

Successfully installed requests-xxxx

方式二:指定版本安装

pip install 模块名==版本号

示例:

pip install requests==2.31.0

方式三:升级模块

pip install 模块名 --upgrade

示例:

pip install requests --upgrade

第三方模块的使用

安装完成后即可 import:

import requests

resp = requests.get("https://www.baidu.com")
print(resp.text)

PDF 截图中的解释:

  • requests.get() 发送 HTTP GET 请求
  • resp.text 获取响应内容

第三方模块放在哪里?(PDF 页面解释)

安装后的第三方模块会放在 site-packages 目录下:

示例路径(PDF 文字):

C:\Users\xxx\AppData\Local\Programs\Python\Python39\Lib\site-packages

注意:

  • 不要在此目录中手动修改文件
  • pip 会自动管理第三方模块的安装与卸载

包(package)

包是更大一级的代码组织结构,用于管理大量模块。
通俗理解:

包 = 文件夹(目录) + 一组相关模块(.py 文件) + 一个 init.py 文件

包的作用:

  • 让 Python 项目的目录结构更清晰
  • 更适合大型项目的模块化开发
  • 管理多个模块的命名空间
  • 支持从包中按层级导入模块和功能

包的目录结构(PDF 示例完整文字版)

PDF 第 8 页展示了一个典型包结构(图示文字化如下):

my_package/              ← 包的文件夹
│
├── __init__.py          ← 包初始化文件(包的标识)
├── module1.py
├── module2.py
└── module3.py

重要说明:

  • 一个目录只有包含 __init__.py 文件,才会被 Python 识别为包。
  • 包内可以继续嵌套子包。

包的导入方式

PDF 介绍了两种主要方式:


方式一:import 包名.模块名

import my_package.module1
my_package.module1.add(5, 3)

方式二:from 包名.模块名 import 功能名

from my_package.module1 import add
add(5, 3)

更简洁。


示例

目录:

my_package/
│
├── __init__.py
├── math_tool.py
└── string_tool.py

math_tool.py:

def add(x, y):
    print(x + y)

string_tool.py:

def upper_case(s):
    print(s.upper())

使用包(PDF 第 9 页示例):

from my_package.math_tool import add
from my_package.string_tool import upper_case

add(3, 5)
upper_case("guanzhi")

输出(PDF 中结果文字化):

8
GUANZHI

init.py 的作用

标识该目录为包

没有这个文件 → Python 不把它当包
有这个文件 → 可以 import 这个包


包的初始化(控制包的行为)

当包被 import 时,会自动执行 __init__.py 中的代码。

例如:

init.py:

print("包被初始化了")

执行:

import my_package

输出:

包被初始化了

控制包被 import * 时能导出的内容(使用 all)

与模块的 __all__ 用法相同。

例:

init.py:

__all__ = ["math_tool"]

意味着:

from my_package import *

只会导入:

my_package.math_tool

不会导入 string_tool 等其他模块。


包的嵌套

包内可以继续包含子包,例如:

project/
│
├── data/
│   ├── __init__.py
│   ├── reader.py
│   └── writer.py
│
└── utils/
    ├── __init__.py
    └── time_tool.py

使用:

from project.data.reader import read_csv
from project.utils.time_tool import now

包的小结

  • 包是“模块的集合”
  • 目录中必须有 __init__.py 才能成为包
  • 包可以嵌套子包
  • 从包中导入功能需使用完整路径(包名 → 模块名 → 功能名)
  • __init__.py 用于初始化与导出控制

Python 模块搜索路径

当执行:

import xxx

Python 并不会盲目载入模块,而是按照一套固定的“搜索路径”规则去查找对应的模块或包。

理解模块搜索路径非常重要,它能帮助你解决:

  • 为什么某个模块明明存在却提示找不到?
  • 为什么导入的不是我写的模块,而是系统的?
  • 为什么修改模块后 Python 不生效?

PDF 第 10~12 页完整解释了 Python 的 import 搜索机制。


Python 导入模块时的搜索顺序

当 import 一个模块时,Python 会按以下顺序查找:

1. 当前程序所在目录(当前工作路径)

首先查找运行脚本所在的目录。
这就是为什么自定义模块与主程序放在同级目录下可以直接导入。


2. 系统环境变量 PATH 指定的路径

若当前目录没有,再到系统环境变量指定的路径中查找。

常见路径如:

C:\Python39\
C:\Python39\DLLs\

3. Python 的第三方库安装目录(site-packages)

这里存放 pip 安装的第三方模块。

通常位置:

.../PythonXX/Lib/site-packages/

所有通过 pip install 的模块都在这里。


4. 内置模块目录

如:

.../PythonXX/Lib/

此处包含大量 Python 自带模块(os、sys、math 等)。


5. 如果全部找不到 → 报错

ModuleNotFoundError: No module named 'xxx'

sys.path 查看模块搜索路径

PDF 第 12 页示例(完整文字化):
你可以使用 sys.path 查看 Python 的搜索路径列表。

示例:

import sys
print(sys.path)

输出类似:

[
 'C:\\code\\pythonDemo',
 'C:\\Python39\\python39.zip',
 'C:\\Python39\\DLLs',
 'C:\\Python39\\lib',
 'C:\\Python39',
 'C:\\Python39\\Lib\\site-packages'
]

说明:

  • sys.path 是一个列表
  • 其中的每个路径都是 import 会去查找模块的位置
  • 你也可以手动向 sys.path 追加目录,实现自定义模块路径管理

例如:

import sys
sys.path.append("C:/my_modules")

这会让 Python 能导入你放在 C:/my_modules 目录下的模块。


为什么 Python 会导入错模块?

如果你的文件名与内置模块同名,例如:

time.py

那么执行:

import time

Python 会优先加载当前目录中的文件,而不是系统内置模块,导致各种异常:

AttributeError: module 'time' has no attribute 'sleep'

原因就是模块搜索顺序决定的:
当前目录优先级最高。


模块搜索路径小结

  • import 时 Python 会从 sys.path 中的路径依次查找模块
  • 当前目录优先级最高
  • pip 安装的模块位于 site-packages
  • 文件名不要与系统模块冲突
  • sys.path 可手动扩展模块搜索路径

模块(Module)

模块是一个 .py 文件,用于封装功能。

作用:

  • 功能拆分
  • 代码复用
  • 提高可维护性

引入方式:

import 模块
from 模块 import 功能
from 模块 import *
import 模块 as 别名
from 模块 import 功能 as 别名

模块文件中可以包含:

  • 变量
  • 函数
  • 可执行代码

自定义模块注意:

  • 模块名不能与内置模块冲突(如 time.py)
  • 使用 __main__ 区分直接运行与被导入
  • 使用 __all__ 控制 import * 可导出的内容

内置模块 & 第三方模块

内置模块(无需安装)
如:time、random、math、os、sys…

示例:

import random
num = random.randint(0, 10)

第三方模块(需 pip 安装)

pip install 模块名
pip install 模块名==版本号
pip install 模块名 --upgrade

使用方式与内置模块一致:

import requests
requests.get(...)

包(Package)

包是模块的集合。

目录结构:

my_package/
│── __init__.py
│── module1.py
│── module2.py

init.py 的作用:

  • 标识该目录是一个包
  • 初始化包
  • 控制包导出的内容(使用 all

包的导入方式:

import 包名.模块名
from 包名.模块名 import 功能

包可以互相嵌套,支持多级导入。


Python 模块搜索路径(import 原理)

Python 导入模块时,会按顺序搜索:

  1. 当前程序运行目录
  2. 系统环境变量 PATH
  3. 第三方库目录 site-packages
  4. Python 内置模块路径
  5. 若仍未找到 → 报错

查看模块搜索路径:

import sys
print(sys.path)

可修改:

sys.path.append("自定义路径")

注意:当前目录优先级最高 → 文件名不能与内置模块重名。


整体总结(思维导图文字化)

模块:

  • 提供功能
  • 多种导入方式
  • 注意命名
  • 支持功能导出控制(all
  • 入口判断(main

包:

  • 模块集合
  • 必须有 init.py
  • 支持嵌套
  • 按层级导入模块和功能

第三方模块:

  • pip 安装
  • 存放在 site-packages

模块搜索路径:

  • import 搜索 sys.path
  • 可自定义扩展路径
  • 避免命名冲突

一句话总结:

模块让功能复用更方便;
包让项目结构更清晰;
import 机制让 Python 能在合适的位置找到你的模块。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇