第 24 章 模块包 模块包
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
到目前为止,当我们导入模块时,我们一直在加载文件。这代表了模块的典型用法,而且这可能是您在 Python 职业生涯早期的大多数导入代码中会用到的技术。然而,模块导入的故事比我迄今为止所暗示的要丰富一些。
除了模块名,导入还可以命名一个目录路径。一个 Python 代码的目录被称为是一个包,所以这样的导入被称为包导入。实际上,包导入将计算机上的一个目录变成了另一个 Python 命名空间,其属性与该目录包含的子目录和模块文件相对应。
这是一个有点高级的功能,但它提供的层次结构对于组织大型系统中的文件非常方便,而且往往能简化模块搜索路径的设置。我们将看到,当一台机器上安装了多个同名程序文件时,有时也需要使用包导入来解决导入歧义问题。
因为它只与包内的代码有关,所以我们也将在这里介绍 Python 最近的相对导入模型和语法。正如我们将看到的,这个模型修改了 3.X 中的搜索路径,并且 扩展了 2.X 和 3.X 中用于包内导入的from 语句。这个模型可以使这种包内导入更明确、更简洁,但也会带来一些影响程序的折衷。
最后,对于使用 Python 3.3 及更高版本的读者,这里还介绍了新的命名空间包模型,它允许包跨越多个目录,并且不需要初始化文件。这种新式包模型是可选的,可以与原始(现在称为 "常规")包模型一起使用,但它颠覆了原始模型的一些基本思想和规则。因此,我们将首先为所有读者探讨常规包,最后介绍命名空间包,作为一个可选主题。
软件包导入基础知识
在基本层面上, 软件包导入是简单明了的--在import 语句中命名一个简单文件的地方,可以用列出一个用句号分隔的名称路径:
import dir1.dir2.mod
同样适用于from语句:
from dir1.dir2.mod import x
这些语句中的 "虚线 "路径假定对应于计算机目录层次结构中通向文件mod.py(或类似文件;扩展名可能有所不同)的路径。也就是说,前面的语句表示在你的计算机上有一个目录dir1,它有一个子目录dir2,其中包含一个模块文件mod.py(或类似文件)。
此外,这些导入意味着dir1位于某个容器目录dir0 中,而dir0 是正常 Python 模块搜索路径的一个组成部分。换句话说,这两条import 语句隐含的目录结构是这样的(用 Windows 反斜线分隔符表示):
dir0\dir1\dir2\mod.py # Or mod.pyc, mod.so, etc.容器目录dir0需要添加到模块搜索路径中,除非它是顶层文件的主目录,就像dir1是一个简单的模块文件一样。
更正式地说,软件包导入路径中最左侧的组件仍然是相对于sys.path 模块搜索路径列表中的目录的,我们在第 22 章中探讨过这个问题。但从这里开始,脚本中的导入语句会明确给出指向包中模块的目录路径。
软件包和搜索路径设置
如果使用此功能,请注意 ,导入语句中的目录路径只能是用句号分隔的变量。您不能在导入语句中使用任何特定平台的路径语法,如C:\dir1,My
Documents.dir2 或../dir1- 这些语法不起作用。相反,您可以在模块搜索路径设置中使用任何此类特定平台的语法来命名容器目录。
例如,在前面的示例中,dir0--您添加到模块搜索路径中的目录名--可以是一个任意长且特定于平台的目录路径,通向dir1。 您不能使用这样的无效语句:
import C:\mycode\dir1\dir2\mod ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access