十四、包

一、包概述

包是一种管理 Python 模块命名空间的形式。

通过使用模块名来构造 Python 模块命名空间的一种方式。例如,模块名 A.B 表示名为 A 的包中名为 B 的子模块。通常我们将多个有联系的模块放入一个包中。包与文件夹相似,不过该文件夹下必须有一个 __init__.py 文件。

假设要为统一处理声音文件与声音数据设计一个模块集(包)。声音文件的格式很多(通常以扩展名来识别,例如:.wav、.aiff、.au),因此,为了不同文件格式之间的转换,需要创建和维护一个不断增长的模块集。为了实现声音数据的不同处理(例如:混声、添加回声、均衡器功能、创造人工立体声效果),还要编写无穷无尽的模块流。下面这个分级文件树展示了这个包的架构:

sound/
    
	__init__.py          # 最高层级的包,初始化 sound 包
    
	formats/             # 用于文件格式转换的子包
        __init__.py
        wavread.py
        wavwrite.py
        aiffread.py
        aiffwrite.py
        auread.py
        aunwrite.py
        ...
    
	effects/             # 声音效果处理子包
        __init__.py
        echo.py
        surround.py
        reverse.py
        ...
    
	filters/             # 过滤器子包
        __init__.py
        equalizer.py
        vocoder.py
        karaoke.py
        ...



二、创建包

__init__.py 可以只是一个空文件,也可以执行包的初始化代码或设置 __all__ 变量。

在 PyCharm 创建一个 graph 文件夹,并在其中创建 circle.py、rectangle.py 文件。其中 __init__.py 文件暂时为空。circle.py 和 rectangle.py 文件写入代码。

Snipaste_2026-08-09_17-55-20

circle.py

""" circle.py """

radius = 10
PI = 3.1415926

def area(radius):
    return PI * radius * radius

def perimeter(radius):
    return 2 * PI * radius

rectangle.py

""" rectangle.py """

rectangle_width = 10
rectangle_height = 10


def area(width, height):
    return width * height

def perimeter(width, height):
    return 2 * (width + height)

在包外创建一个 main.py 文件。

整体结构如下,其中 graph 为一个包:

Snipaste_2026-08-09_18-10-04



三、导入包

3.1、全局导入 import

导入包中模块的所有成员。

3.1.1、语法
import 包名.模块名 [as 别名])
3.1.2、调用方式
包名.模块名.成员名
3.1.3、注意

使用 import 时,除最后一项外都必须是包。最后一项可以是模块或包,但不能是类、函数或变量。

如果最后一项是包,那么必须在被导入包的 __init__.py 文件中,指定导入包中的哪些模块。这是 Python 导入包的一个优化机制,避免导入过多模块。并且在 __init__.py 中指定导入模块的时候,建议使用相对路径:

from . import circle

如果是绝对路径,那么会把导入的模块 circle 作为顶级模块,直接从 sys.path 中去找 circle 模块,而不是找 graphic.circle:

import circle   # 不推荐,容易导致导入错误



3.2、局部导入包下的模块 from ... import ...

从包中导入模块。

3.2.1、语法
from 包名 import 模块名 [as 别名]
3.2.2、调用方式:模块名.成员名
from graphic import circle

print(circle.area(10))  # 314.15926



3.3、局部导入包下模块的成员 from ... import ...

从包中模块导入功能。

3.3.1、语法
from 包名.模块名 import 成员名 [as 别名]
3.3.2、调用方式:成员名
from graphic.circle import area

print(area(10))  # 314.15926



3.4、局部导入 from ... import * 从包中导入模块

当我们使用 from ... import * 时,Python 并不会查找并导入包的所有子模块,因为这将花费很长的时间,并且可能会产生我们不想要的副作用。

唯一的解决办法是提供包的显式索引。如果包的 __init__.py 中定义了 all,运行 from ... import * 时,它就是被导入的模块名列表。

3.4.1、语法
from 包名.模块名 import *
3.4.2、调用方式:模块名.功能名

__init__.py 中添加如下内容:

__all__ = ["circle"]

注意:如果不加会无法导入包

在 main.py 中使用 from import * 导入模块:

from graphic import *

print(circle.area(10))  # 314.15926
print(rectangle.area(10))  # 报错



四、常用标准库(包)

标准库指的是在安装 Python 时就一同被安装的库。这些库经过精心挑选和开发,旨在为 Python 开发者提供通用且强大的工具集,涵盖各种不同的应用领域。

名称 说明
os 多种操作系统接口。
sys 系统相关的模块和函数。
time 时间的访问和转换。
datetime 提供了用于操作日期和时间的类。
math 数学函数。
random 生成伪随机数。
re 正则表达式匹配操作。
json JSON 编码器和解码器。
collections 实现了一些专门化的容器,提供了对 dict、list、set 和 tuple 的补充。
functools 高阶函数,以及可调用对象上的操作。
hashlib 安全哈希与消息摘要。
urllib URL 处理模块。
smtplib SMTP 协议客户端,邮件处理。
zlib 与 gzip 兼容的压缩。
gzip 对 gzip 文件的支持。
bz2 对 bzip2 压缩算法的支持。
multiprocessing 基于进程的并行。
threading 基于线程的并行。
copy 浅层及深层拷贝操作。
socket 低层级的网络接口。
shutil 提供了一系列对文件和文件集合的高阶操作,特别是提供了一些支持文件拷贝和删除的函数。
glob Unix 风格的路径名模式扩展。

更多标准库可参考 https://docs.python.org/zh-cn/3/library/index.html



五、引入第三方库

当需要使用 Python 中没有内置的库时,可以通过以下方式安装第三方库

5.1、pip 命令方式

pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。pip 默认的源是 Python Package Index(PyPI),其地址为 https://pypi.org/simple/,如果下载比较慢,还可以指定其它的源

5.1.1、pip 常用命令

1、查看我们已经安装的软件包

pip list

2、安装软件包-具体包名就可以到 PyPI 上查找

pip install 包名

3、卸载软件包

pip uninstall 包名

4、临时使用其他源

pip install -i http://mirrors.aliyun.com/pypi/simple/ 包名

5、永久修改源

pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
5.1.2、安装 requests 包步骤

Snipaste_2026-08-09_19-18-50

通过命令行的方式安装,是将第三方包安装在本地python下,例如:D:\dev\software\Python3.12.8\Lib\site-packages



5.2、Pycharm中引入

5.2.1、点击右下角的解释器设置

Snipaste_2026-08-09_19-24-40

5.2.2、点击+号

Snipaste_2026-08-09_19-25-41

5.2.3、搜索要添加的包

Snipaste_2026-08-09_19-26-37

通过Pycharm安装,我们选择的解释器类型每个项目独立的,所以是将第三方包安装在当前项目环境下,例如:D:\dev\workspace\python-2025.venv\Lib\site-packages



5.3、打包自己的库并安装

5.3.1、先安装 setuptools 库

如果不安装setuptools库,后续打包时可能会遇到报错 ModuleNotFoundError: No module named 'distutils',所以可以提前安装 setuptools 库。在命令提示符中执行如下命令:

pip install setuptools
5.3.2、在包外创建一个 setup.py 文件

Snipaste_2026-08-09_19-36-05

5.3.3、setup.py 中添加如下内容
from distutils.core import setup

setup(
    name="graphic",  # 需要打包的名字
    version="1.0",  # 版本
    py_modules=["graphic.circle", "graphic.rectangle"],  # 需要打包的模块
)
5.3.4、在 setup.py 同级目录下进行构建

Snipaste_2026-08-09_19-38-23

Snipaste_2026-08-09_19-38-51

5.3.5、也可以生成压缩包

python setup.py sdist

Snipaste_2026-08-09_19-40-27

5.3.6、pip 命令安装自己打的库

pip install path_to_your_package/dist/your_package_name-0.1.tar.gz

Snipaste_2026-08-09_19-41-52

5.3.7、Pycharm安装自己打的包库

Snipaste_2026-08-09_19-43-12

Snipaste_2026-08-09_19-43-46

Snipaste_2026-08-09_19-44-16

posted @ 2026-08-09 17:43  jock_javaEE  阅读(4)  评论(0)    收藏  举报