Python中的绝对和相对导入

很多时候,当我们创建python代码时,我们发现我们需要从另一个python文件或包中访问代码。这是当您需要将该其他python文件或程序包导入当前代码时。因此,实现此目的的直接方法只是在当前python程序的顶部编写以下语句。

import package_name or module_name
or
from pacakge_name import module_name/object_name

解析以上语句后,解释器将执行以下操作。

  • 解释器将在先前已导入的所有模块的高速缓存中查找名称。sys.modules中此缓存模块的名称。

  • 如果在上述步骤中未找到,则解释器将在内置模块列表中进行搜索。这些模块是python标准库的一部分。

  • 如果在上面的步骤2中仍然找不到它,那么解释器将在sys.path中定义的目录列表中搜索软件包或模块名称,该目录具有当前目录作为要搜索的第一个目录。

  • 在上述任何一个步骤中找到它们是导入的模块时,程序包或模块的名称都将绑定到当前程序的本地范围。

  • 如果从未找到包或模块,则引发ModuleNotFoundError。

有关导入的一些规则。

应该使用这些语句在文件顶部提到导入语句。必须提到的导入顺序如下。

  • Python的标准库模块

  • 从第三方模块导入

  • 从本地应用程序导入

绝对进口

在这种类型的导入中,我们指定要导入的包/模块/功能的完整路径。目录结构以点(/)的形式使用点(。)。

考虑包的以下目录结构。

python_project_name/packageA/moduleA1.py
python_project_name/packageA/moduleA2.py

另外,假设moduleA2具有一个名为myfunc的函数。当我们想将该函数导入当前的python程序时,然后使用绝对路径,我们提到以下import语句。

from packageA.moduleA2 import myfunc

绝对导入的最大优点是,它清楚地表明了导入发生的位置,而有时它可能会变得很长。

相对进口

在相对导入中,我们提到相对于使用导入模块的当前脚本的位置而言,导入包的路径。

点表示从当前位置开始向上的一个目录,而点两个表示向上两个目录,依此类推。

考虑包的以下目录结构。

python_project_name/packageA/moduleA1.py
python_project_name/packageB/moduleB1.py

假设上述包结构中的moduleB1需要导入moduleA1。然后,导入语句为:

from ..packageA import moduleA1

这两个点表示从moduleB1的位置开始,我们必须移至目录python_project_name,然后转到packageA以获取moduleA1。

这种导入很短,可以将顶层项目从一个位置移动到另一个位置,而无需轻易更改导入语句中的路径。不利的一面是,如果共享导入文件夹,则在路径中进行某些修改后,代码很容易受到影响。