谈谈python中的绝对导入与相对导入
作者:互联网
绝对导入与相对导入
如何区分
import xxx
一定是绝对导入,from xxx import yyy
可能是绝对导入,也有可能是相对导入。具体来说,当xxx
以若干个.
为开头,后者为相对导入。
有何区别
文件的运行
与作为模块运行
当一个模块被导入,其中的代码也将被运行。不过这时的作为模块运行的行为和脚本文件的运行是不同的。如果一个文件作为脚本文件运行,那么它无法使用相对导入。反过来如果是作为模块运行,对于它绝对导入和相对导入都可以使用。
当然,作为模块的文件,如果采用了相对导入,那么其本身就不能够运行了。它的唯一使命就是为了作为一个模块而工作。这样看来,似乎是绝对导入更加好。因为那样的话,其仍然可以运行。
在python3.x中,这个过程就如上面所描述。然而在旧版本的python2.x中,却并不是这样的。想要了解此间的区别和变化,需要先了解python在导入模块时的搜索配置。
python在导入模块时的搜索配置
只有模块被放置在sys.path
内所包含的目录中,它才能为脚本成功搜索到,从而被导入。而sys.path
内所包含的目录有若干个来源,这些来源中就包括根目录以及标准库目录。(这个根目录并不是指运行该文件的时候终端所处的根目录,而是运行文件自身所处的根目录)即使一个文件是以模块的方式被运行,在导入库时的行为也是同样的。
在python2.x之中,来源于根目录中的模块可能会因为相同的名字而和其他路径中的模块发生冲突。而python3.x为了解决这个问题,做出了一些改变。在一个文件被作为模块而运行的时候,它的搜索路径中将不会包括自身的根目录。作为一个比较完整的描述,当一个脚本运行的时候,虽然对于它本身来说,搜索路径中仍然包含自身的根目录,可是它所导入的哪些模块中的导入,也就是对于那些嵌套的导入,在搜索路径中将不会包括其上一级模块的根目录。
这或许将使得在一个包内,绝对导入的使用变得困难。当在构建绝对导入语句的时候,必须从包的最顶层开始构建相对路径。然而,这样做将使得包内各层目录的目录名本身也成为了导入语句的参数之一,当它们被改变,原来的绝对导入语句都将失效。在同样的情况下,使用相对导入则不会遇到同样的问题,因为实际上所需要的只不过是几个点而已。这无疑将有助于包的维护。
总结
这个总结出奇地很简单,因为在这里我们不再关心其原理到底是如何,只关心其所变现出来的特征。关于绝对导入和相对导入:
- 绝对导入将使得模块文件本身也可以作为一个脚本运行,这将有助于完成一些简单的测试。
- 相对导入使得导入语句不依赖于包内目录名作为参数,这将有助于包的维护。
注释
在python2.x中,可以通过在文件开头包含一句:
from __future__ import absolute_import
来使得其在导入的有关问题上,行为表现得和python3.x一致,明显这是一个过渡用的选项。
标签:文件,python,绝对,谈谈,导入,模块,根目录,运行 来源: https://www.cnblogs.com/aoout/p/15362745.html