绝对路径和相对路径

我们的最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:

绝对导入:以glance作为起始。

优点:比较直观

相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)

优点:可以随意移动包,只要能找到包的位置,就可以使用包里面的模块。

缺点:不能在包里面使用模块了。比如在policy模块中就不能调用外面的模块。

例如:我们在glance/api/version.py中想要导入glance/cmd/manage.py

在glance/api/version.py

#绝对导入
from glance.cmd import manage
manage.main()

#相对导入
from ..cmd import manage
manage.main()
View Code

 

注意:

我们可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入,且包的相对导入只能用from的形式。

比如我们想在glance/api/versions.py中导入glance/api/policy.py,有的同学一抽这俩模块是在同一个目录下,十分开心的就去做了,它直接这么做

 #在version.py中
 import policy
 policy.get()
View Code

没错,我们单独运行version.py是一点问题没有的,运行version.py的路径搜索就是从当前路径开始的,于是在导入policy时能在当前目录下找到

我们知道,我的子包中的模块version.py极有可能是被一个glance包同一级别的其他文件导入,比如我们在于glance同级下的一个test.py文件中导入version.py,如下

from glance.api import versions
'''
执行结果:
ImportError: No module named 'policy'
'''
'''
分析:
此时我们导入versions在versions.py中执行
import policy需要找从sys.path也就是从当前目录找policy.py,
这必然是找不到的
'''

 

 

 

 

 

posted @ 2019-09-09 22:43  套你大象  阅读(236)  评论(0编辑  收藏  举报