相对导包
以当前代码文件执行的所在目录作为起始路径,基于.
或者..
导入模块或包,这样的导包路径写法,就是相对导包。
注意:因为程序所在根目录默认是作为绝对导包的起始导包路径,所以相对导包路径的写法,不能应用于根目录下的文件中。
常见写法如下:
from . import 模块 from .模块 import 变量 from .包 import 模块 from .包.模块 import 变量 from .. import 模块 from ..包 import 模块 from ..包.模块 import 变量
相对导包写法,会因为不同执行文件带来的路径差异,所以容易产生导包路径的写法错误而且还不容易理解,因此开发中,能优先使用绝对导包千万要使用绝对路径导包。
批量导入
导包语句也可以在末尾使用使用逗号,一次性导入多个包/模块/变量,不管使用的是绝对导包,还是相对导包都可以。
import 包名1, 包名2, ... import 包名1.模块名1, 包名1.模块名2, ..., 包名2.模块名1, 包名2.模块名2,... from 包名 import 模块名1, 模块名2, ... from 包名.模块名 import 变量1, 变量2, ...
import os, sys, psutil, datetime # 相当于下面代码的简写 # import os # import sys # import psutil # import datetime from datetime import time, date, datetime # 相当于下面代码的简写 # from datetime import time # from datetime import date # from datetime import datetime
别名调用
导包语句也可以在末尾使用as关键字,对包/模块/变量进行别名调用,不管使用的是绝对导包,还是相对导包都可以。
import 包名1 as 包别名1 import 包名1 as 包别名1, 包2 as 包别名2, ... import 包名1.模块名1 as 模块别名1, 包名1.模块名2 as 模块别名2, .... from 包名 import 模块名1 as 模块别名1, 模块名2 as 模块别名2, ... from 包名.模块名 import 变量1 as 变量别名1, 变量2 as 变量别名2, ...
# 别名调用的作用是,让被导入的变量不要和当前模块中的变量产生冲突 from time import time as ctime print( ctime() ) def time(): return 1 print(time()) print( ctime() )
全部导入
可以通过*
号导入一个模块下所有的内容信息到当前模块,支持绝对导包和相对导包写法的。
模块.py,代码:
from 模块 import * from 包名.模块 import *
from mod12 import * # * 代表把当前模块中所有内容全部导入,注意 * 只是一个符号,不是一个变量,不能使用*号在导包以外的地方 print(a, b, c, d, e, f) # 如果真要查看*号里面都导入了啥东西 print( locals() ) """ {..... '__cached__': None, 'a': 100, 'b': 200, 'c': 300, 'd': 300, 'e': 300, 'f': 300} """
mod12.py,代码:
a = 100 b = 200 c = 300 d = 300 e = 300 f = 300
限制导出
python的所有模块中都提供了一个__all__
魔术变量,可以限制 * 导出内容。只有写在当前模块的__all__
变量中的成员,才能被 * 导出到外界。如果模块没有声明__all__
限制导出内容,则 * 号可以导出当前模块所有内容
__all__ = ['m1_a', 'm1_f'] m1_a = 100 m1_b = 200 m1_c = 200 m1_d = 200 m1_f = 200
主程序.py,代码:
from mod13.m1 import * print(locals()) """ {.... '__cached__': None, 'm1_a': 100, 'm1_f': 200} """
限制执行
在前面的学习中,我们发现一个问题,就是每次导包,路径下的__init__.py
和被导入的模块中代码会自动被执行,所以有时候模块和测试代码也会在导入时自动打印数据
如果希望模块文件中的代码,作为主程序运行时执行,而作为模块被其他文件导包时不要执行,那么可以基于__name__
来限制代码执行
在python中,每一个模块内部都会存在一个魔术变量__name__
在模块被其他文件导入时,值为模块名,如果模块被python 解释器作为主程序执行时,则值为"__main__
"
模块.py,代码:
from mod14 import d14 def fn(): return “hello” if __name__ == '__main__': #可以限制部分测试代码,在被外界导包时,不要执行 fn() print(d14.md_14)
mod14/d14.py,代码:
md_14 = [1,2,3,4,45]
""" __name__是一个魔术变量, 当前文件作为主程序被python解释器运行时,值就是"__main__", 当前文件作为第三方模块被导包时,则值时"导包路径" 例如:__name__=mod14.d14 """xxxxxxxxxx __name__"""__name__是一个魔术变量,当前文件作为主程序被python解释器运行时,值就是 "__main__"当前文件作为第三方模块被导包时,则值是"导包路径",例如:__name__=mod14.d14"""