ZetCode

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


__init__.py 是空的。它可以包含一些代码,也可以是空的。

mfuns.py
def mycube(x):

   return x * x * x 

mfuns.py 模块中,我们定义了一个 cube 函数。

myprog.py
#!/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

我们拥有相同的目录结构。

__init__.py
from .mfuns import mycube

__init__.py 文件中,我们导入了 mycube 函数。因此,当我们在 mymath 包中引用 mycube 函数时,无需指定模块名。

mfuns.py
def mycube(x):

   return x * x * x 

mfuns.py 模块中,我们定义了一个 cube 函数。

myprog.py
#!/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 脚本。

data.py
colours = ('yellow', 'blue', 'red', 'orange', 'brown')
names = ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')

data.py 模块包含两个元组。

read.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
constants/__init__.py
from .data import names

这是 constants 目录下的 __init__.py 文件。我们导入了 names 元组。

constants/data.py
names = ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')

这是 constants 目录下的 data.py 模块。它包含 names 元组。

numbers/__init__.py
from .myintegers import myintegers

numbers 包中的 __init__.py 文件只有这一行。

numbers/myintegers.py
myintegers = (2, 3, 45, 6, 7, 8, 9)

integers 模块定义了一个包含七个整数的元组。这个元组将从 read.py 脚本中访问。

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 包。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程