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