date: 2021-06-30title: python之包的导入 #标题
tags: #标签
categories: python # 分类
记录下python中导入包的方法。参考:Python之路——模块和包。
假设项目的目录结构如下:
假设每个文件中都只有一句话,就是打印当前在哪个文件中,比如glance/api/__init__.py
中的代码如下:
print('code in glance/api/__init__.py')
glance/db/db_conn.py
中的代码如下:
print('code in glance/db/db_conn.py')
为了验证其他功能,在api/policy.py文件中的代码如下:
print('code in glance/api/policy.py')
def get():
print('运行的是 glance/api/policy.py 文件中的get函数')
aa = 'bbbbcccf'
假设demo.py中的代码如下:
# 后面注释的内容是代码运行后打印的内容
# 导入一个包(文件夹)相当于执行了这个包下的__init__.py文件
# 并不相当于把这个包下的所有文件都导入进来了
import glance.api # code in glance/api/__init__.py
import glance.db # code in glance/db/__init__.py
import glance.cmd # code in glance/cmd/__init__.py
import glance.api.policy as policy # code in glance/api/policy.py
policy.get() # 运行的是 glance/api/policy.py 文件中的get函数
print(policy.aa) # bbbbcccf
结论:当在导入目录后,会自动执行该目录下的__init__.py
文件中的代码。也可以使用其变量。如果要导入某个路径下的文件,比如api/policy,可以写为import api.policy as policy
,as 后面是给这个导入的模块定义个别名,方便调用。
如果想要直接导入某个包(文件夹)下的文件,有两种方式:
# 方式一
import glance.api.policy as policy
'''
# 输出:
code in glance/api/__init__.py
code in glance/api/policy.py
'''
policy.get() # 输出:运行的是 glance/api/policy.py 文件中的get函数
# 方式二
from glance.api import policy
# from......import 语句中,import后面不能带点号
# from......import 语句中,import后面必须是一个明确的文件或方法或者星号通配符
policy.get()
'''
如果上面两种方式同时执行,则输出如下:
code in glance/api/__init__.py
code in glance/api/policy.py
运行的是 glance/api/policy.py 文件中的get函数
运行的是 glance/api/policy.py 文件中的get函数
说明__init__.py文件只会在同一个文件初次导入时执行
也就是说不管在同一个文件中导入几次,只会执行一次
'''
如果想导入一个目录下的所有文件,可以使用如下方式:
from glance.api import *
policy.get()
# 打印如下:
code in glance/api/__init__.py
code in glance/api/policy.py
运行的是 glance/api/policy.py 文件中的get函数
也可以直接导入某个方法
from glance.api.policy import get
get()
# 打印如下:
code in glance/api/__init__.py
code in glance/api/policy.py
运行的是 glance/api/policy.py 文件中的get函数
如下是绝对路径导入:
# glance/__init__.py文件内容如下:
from glance import api
# glance/api.__init__.py文件内容如下:
print('code in glance/api/__init__.py')
from glance.api import policy
# demo.py文件如下:
import glance
glanceapi.policy.get()
# 输出如下:
code in glance/api/__init__.py
code in glance/api/policy.py
运行的是 glance/api/policy.py 文件中的get函数
如下是相对导入,其中,一个点代表当前路径,两个点代表上级目录:
# glance/__init__.py文件内容如下:
from . import api
# glance/api.__init__.py文件内容如下:
print('code in glance/api/__init__.py')
from . import policy
# demo.py文件如下:
import glance
glanceapi.policy.get()
# 输出如下:
code in glance/api/__init__.py
code in glance/api/policy.py
运行的是 glance/api/policy.py 文件中的get函数
关于相对导入和绝对导入在工作中都会用到,具体使用场景如下:当你需要写一个功能,这个功能不是直接运行的,而是被别人导入之后使用的,这种情况如果你的这个独立功能形成文件夹,那么文件夹内所有文件都需要使用相对导入。但是如果我们自己开发一个项目,这个项目有一些文件是需要直接运行的,这种情况下不适合用相对导入,否则会报错,需要使用绝对导入。