Python 包
最后修改于 2024 年 1 月 29 日
本文介绍 Python 包。
Python 包是具有共同目的的模块的集合。包目录必须包含一个名为 __init__.py 的特殊文件。(自 Python 3.3 起,定义包目录不再强制要求 __init__.py 文件。) Python 模块是单个 Python 文件。
当处理包含成百上千个模块的大型项目时,使用包至关重要。例如,我们可以将所有与数据库相关的模块放在一个 database 包中,将用户界面代码放在 ui 包中。
内置包位于预定义的目录中;例如,在 Debian Linux 上是 /usr/lib/python3.5,或者在 Windows 上是 C:\Users\Jano\AppData\Local\Programs\Python\Python36-32\Lib\site-packages。
第三方包被安装到预定义的目录中,例如在 Debian Linux 上是 /usr/local/lib/python3.5/dist-packages,或者在 Windows 上是 C:\Users\Jano\AppData\Local\Programs\Python\Python36-32\libs。
Python 包管理
Python 包通过 Python 包管理器 pip 进行管理。
$ sudo pip3 install arrow
例如,使用上述命令安装 arrow 库。
$ sudo pip3 uninstall arrow
要卸载 arrow,我们使用上述命令。
带有空 __init__.py 的 Python 包
在第一个示例中,我们在 Python 中创建一个简单的包。
$ tree . ├── mymath │ ├── __init__.py │ └── mfuns.py └── myprog.py
在当前工作目录中,我们有一个 mymath 目录和一个 myprog.py 脚本。mymath 包含 __init__.py 文件,该文件将 mymath 目录标记为一个包目录。
mymath 目录有两个文件:__init__.py 文件将 constants 标记为 Python 包目录,而 mfuns.py 是一个 Python 模块。
__init__.py 是空的。它可以包含一些代码,也可以是空的。
def mycube(x): return x * x * x
在 mfuns.py 模块中,我们定义了一个 cube 函数。
#!/usr/bin/python # myprog.py from mymath.mfuns import mycube print(mycube(3))
在 myprog.py 程序中,我们从 mymath.mfuns 模块导入 mycube 函数。模块名和包名用点字符分隔。
在 __init__.py 中导入 Python 函数
在下一个示例中,我们在 __init__.py 文件中包含了一些代码。
$ tree . ├── mymath │ ├── __init__.py │ └── mfuns.py └── myprog.py
我们拥有相同的目录结构。
from .mfuns import mycube
在 __init__.py 文件中,我们导入了 mycube 函数。因此,当我们在 mymath 包中引用 mycube 函数时,无需指定模块名。
def mycube(x): return x * x * x
在 mfuns.py 模块中,我们定义了一个 cube 函数。
#!/usr/bin/python # myprog.py from mymath import mycube print(mycube(3))
在 myprog.py 程序中,我们导入了 mycube 函数。这次我们省略了模块名。
没有 __init__.py 的 Python 包
自 Python 3.3 起,无需使用 __init__.py 文件即可定义包目录。
read.py
constants/
data.py
在当前工作目录中,我们有一个 constants 目录和一个 read.py 脚本。
colours = ('yellow', 'blue', 'red', 'orange', 'brown')
names = ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
data.py 模块包含两个元组。
#!/usr/bin/python # read.py from constants.data import colours import constants.data as mydata print(colours) print(mydata.names)
在 read.py 脚本中,我们导入元组并将其打印到终端。
$ ./read.py
('yellow', 'blue', 'red', 'orange', 'brown')
('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
Python arrow 包
arrow 是一个用于在 Python 中处理日期和时间的第三方库。
$ ls /usr/local/lib/python3.5/dist-packages/arrow api.py arrow.py factory.py formatter.py __init__.py locales.py parser.py __pycache__ util.py
该库安装在 arrow 目录下的 dist-packages 中(在 Debian Linux 上)。该库使用 pip 包管理器安装。正如我们所见,该库是 Python 模块的集合。
Python 子包
我们也可以创建子包。要访问子包,我们使用点运算符。
$ tree . ├── constants │ ├── __init__.py │ ├── data.py │ └── numbers │ ├── __init__.py │ └── myintegers.py └── read.py
from .data import names
这是 constants 目录下的 __init__.py 文件。我们导入了 names 元组。
names = ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
这是 constants 目录下的 data.py 模块。它包含 names 元组。
from .myintegers import myintegers
numbers 包中的 __init__.py 文件只有这一行。
myintegers = (2, 3, 45, 6, 7, 8, 9)
integers 模块定义了一个包含七个整数的元组。这个元组将从 read.py 脚本中访问。
#!/usr/bin/python # read.py from constants import names from constants.numbers import myintegers print(names) print(myintegers)
这是 read.py 程序。我们从 constants 包导入 names 元组,并从 constants.numbers 子包导入 myintegers 元组。
$ ./read.py
('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
(2, 3, 45, 6, 7, 8, 9)
来源
本文介绍了 Python 包。
作者
列出所有 Python 教程。