absolute_import 绝对导入
绝对导入,指从顶层用import
直接导入模块,即(只)从sys.path
中导入模块。 例如:
|
|
import
关键词的歧义?
之所以引入绝对导入
,是因为python中的import
关键词存在歧义。当import foo
被定义时,用户根本无法得知foo
这个模块是内置模块,第三方安装模块,还是用户当前包下的自定义模块。目前python2.7.x默认情况下是优先导入当前目录下的自定义模块,那么在有冲突的情况下,内置(第三方)模块foo
怎么导入?
如果相反,默认情况下导入的是内置或者第三方安装模块,那么本地的foo
模块可以通过间接导入
以from . import foo
方式导入,从而解决这个问题。
因此,绝对导入
的概念被引入。python2.7.x可以通过from __future__ import absolute_import
改变import
行为,强制import foo
导入的是sys.path
下的模块,并且本地模块(非sys.path
下的模块)必须通过相对导入
的方式进行导入。
举例说明
目录结构如下:
|
|
当前的文件package.subpackage1.moduleX.py
|
|
ValueError: Attempted relative import in non-package
在上面的例子中,当试图直接运行python moduleX.py
时会报如上错误。
当直接运行moduleX.py
时,此文件被视为一个顶层的脚本而不是包。 而在一个顶层脚本里是不能进行相对引用的。
可以在package层添加test.py
脚本进行测试,内容如下。
|
|
此时,package整体作为一个包,包内就可以进行相对导入
了。 最终目录结构如下:
|
|