原文: http://zetcode.com/lang/python/packages/

在 Python 编程教程的这一部分中,我们介绍了包。

Python 包是具有通用目的的模块的集合。 包目录必须有一个名为__init__.py的特殊文件。 (从 Python 3.3 开始,不再需要__init__.py来定义包目录。)Python 模块是单个 Python 文件。

当我们处理包含成百上千个模块的大型项目时,使用包至关重要。 例如,我们可以将所有与数据库相关的模块放在一个数据库包中,并将用户界面代码放在ui包中。

内置包可在预定义目录中使用; 例如 Debian Linux 上的/usr/lib/python3.5C:\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进行管理。

  1. $ sudo pip3 install arrow

例如,使用上述命令安装了箭头库。

  1. $ sudo pip3 uninstall arrow

要卸载箭头,我们使用上面的命令。

__init__.py的 Python 包

在第一个示例中,我们使用 Python 创建一个简单的包。

  1. $ tree
  2. .
  3. ├── mymath
  4. ├── __init__.py
  5. └── mfuns.py
  6. └── myprog.py

在当前工作目录中,我们有一个mymath目录和一个myprog.py脚本。 mymath包含__init__.py文件,该文件将mymath目录标记为包目录。

mymath目录有两个文件:__init__.py文件使常量成为 Python 包目录,而mfuns.py是 Python 模块。

__init__.py

__init__.py为空白。 它可以包含一些代码,但也可以为空。

mfuns.py

  1. def mycube(x):
  2. return x * x * x

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

myprog.py

  1. #!/usr/bin/env python
  2. # myprog.py
  3. from mymath.mfuns import mycube
  4. print(mycube(3))

myprog.py程序中,我们从mymath.mfuns模块导入mycube函数。 模块名称和包名称用点字符分隔。

__init__.py中的 Python 导入功能

在下一个示例中,我们在__init__.py文件中有一些代码。

  1. $ tree
  2. .
  3. ├── mymath
  4. ├── __init__.py
  5. └── mfuns.py
  6. └── myprog.py

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

__init__.py

  1. from .mfuns import mycube

__init__.py文件中,我们导入mycube函数。 结果,当我们从mymath包中引用mycube函数时,我们不必指定模块名称。

mfuns.py

  1. def mycube(x):
  2. return x * x * x

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

myprog.py

  1. #!/usr/bin/env python
  2. # myprog.py
  3. from mymath import mycube
  4. print(mycube(3))

myprog.py程序中,我们导入mycube函数。 这次我们省略了模块名称。

没有__init__.py的 Python 包

从 Python 3.3 开始,无需使用__init__.py文件就可以定义包目录。

  1. read.py
  2. constants/
  3. data.py

在当前工作目录中,我们有一个constants目录和一个read.py脚本。

data.py

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

data.py模块有两个元组。

read.py

  1. #!/usr/bin/env python
  2. # read.py
  3. from constants.data import colours
  4. import constants.data as mydata
  5. print(colours)
  6. print(mydata.names)

read.py脚本中,我们导入元组并将其打印到终端。

  1. $ ./read.py
  2. ('yellow', 'blue', 'red', 'orange', 'brown')
  3. ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')

Python arrow

arrow是用于在 Python 中处理日期和时间的第三方库。

  1. $ ls /usr/local/lib/python3.5/dist-packages/arrow
  2. api.py arrow.py factory.py formatter.py __init__.py
  3. locales.py parser.py __pycache__ util.py

该库安装在 Debian Linux 中dist-packages下的arrow目录中。 该库随pip包管理器一起安装。 如我们所见,该库是 Python 模块的集合。

Python 子包

我们还可以创建子包。 要访问子包,我们使用点运算符。

  1. $ tree
  2. .
  3. ├── constants
  4. ├── __init__.py
  5. ├── data.py
  6. └── numbers
  7. ├── __init__.py
  8. └── myintegers.py
  9. └── read.py

这是新的层次结构。 我们有一个称为数字的子包。

constants/__init__.py

  1. from .data import names

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

constants/data.py

  1. names = ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')

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

numbers/__init__.py

  1. from .myintegers import myintegers

数字包中的__init__.py文件具有这一行。

numbers/myintegers.py

  1. myintegers = (2, 3, 45, 6, 7, 8, 9)

整数模块定义了七个整数的元组。 该元组将通过read.py脚本进行访问。

read.py

  1. #!/usr/bin/env python
  2. # read.py
  3. from constants import names
  4. from constants.numbers import myintegers
  5. print(names)
  6. print(myintegers)

这是read.py程序。 我们从constants包中导入names元组,并从constants.numbers子包中导入myintegers元组。

  1. $ ./read.py
  2. ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
  3. (2, 3, 45, 6, 7, 8, 9)

这是输出。

在本章中,我们介绍了 Python 包。