importlib是一个模块,可以进行动态导入模块。
导入模块的对比:
示例代码:
import importlib
import time
t1 = __import__('time')
t2 = importlib.import_module('time')
print(t1 is t2)
print(t1 == t2)
print(time is t1)
print(time == t1)
print(time is t2)
print(time == t2)
print(time is t1 is t2)
print(time == t1 == t2)
运行结果:
importlib模块支持传入字符串来引入一个模块。创建两个简单的模块来验证这个功能。创建两个模块,分别为test.py和test2.py,代码如下所示,
def main():
print(__name__)
使用importlib来引入它们。新建一个文件与test.py和test2.py在同意目录下。
import importlib
def dynamic_import(module):
return importlib.import_module(module)
if __name__ == "__main__":
module = dynamic_import('test')
module.main()
module_two = dynamic_import('test2')
module_two.main()
运行结果:
验证模块是否存在
示例代码:
import importlib
import importlib.util # 只能这样导入util
def check_module(module_name):
module_spec = importlib.util.find_spec(module_name)
if module_spec is None:
print("Module :{} not found".format(module_name))
return None
else:
print("Module:{} can be imported!".format(module_name))
return module_spec
def import_module_from_spec(module_spec):
module = importlib.util.module_from_spec(module_spec)
module_spec.loader.exec_module(module)
return module
if __name__ == "__main__":
module_spec = check_module("fake_module")
if module_spec:
module = import_module_from_spec(module_spec)
print(dir(module))
print("*" * 100)
module_spec = check_module("time")
if module_spec:
module = import_module_from_spec(module_spec)
print(dir(module))
运行结果: