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程序时,使用绝对路径,我们使用以下导入语句。

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。

这种导入比较简洁,顶级项目可以轻松地从一个位置移动到另一个位置,而无需更改导入语句中的路径。缺点是,如果共享导入文件夹,则当路径发生某些修改时,代码很容易受到影响。

更新于:2019年7月30日

532 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告