__import__函数功能用于动态的导入模块,主要用于反射或者延迟加载模块(满足条件才加载)。
实验环境
目录结构
├── pkg
│ ├── __init__.py
│ ├── mod2.py
│ ├── mod.py
│ └── __pycache__
│ ├── __init__.cpython-36.pyc
│ ├── mod2.cpython-36.pyc
│ └── mod.cpython-36.pyc
└── test.py
mod.py文件内容:
print('mod')
mod2.py文件内容:
print('mod2')
__import__函数使用
原型: import(name, globals=None, locals=None, fromlist=(), level=0)
- name:
要导入的模块名,可使用变量(而使用import时只会查找对应的模块名)
当name变量的形式为package.module时,也会返回顶层模块(因为这是由import语句绑定到名称的对象),而不是按名称命名的模块
测试代码:
pkg = __import__('pkg.mod')
print('test.py')
print(pkg)
# output
'''
mod
test.py
<module 'pkg' from '/home/cs/tt/test/pkg/__init__.py'> // 返回顶级包
'''
- fromlist:
指定要导入的子模块名或对象名,它们会按名称从模块导入; fromlist为空时则导入顶级包(如果是包)或者模块(如上面的测试代码情况)
pkg = __import__('pkg', fromlist=['mod', 'mod2']) # 返回pkg包,检索fromlist中要导入的名称并将其分配给它们各自的名称
print('test.py')
print(pkg)
# output
'''
mod # 该显示说明模块被导入时需要编译
mod2
test.py
<module 'pkg' from '/home/cs/tt/test/pkg/__init__.py'>
'''
观察导入后绑定的pkg.mod和pkg.mod2模块对象
pkg = __import__('pkg', fromlist=['mod', 'mod2'])
print('test.py')
mod = pkg.mod # 等同 'from pkg import mod'
print(mod)
print(pkg.mod) # 查看绑定的模块对象mod,
mm = pkg.mod2 # 等同 'from pkg import mod2 as mm'
print(mm)
# output
'''
mod
mod2
test.py
<module 'pkg' from '/home/cs/tt/test/pkg/__init__.py'>
<module 'pkg.mod' from '/home/cs/tt/test/pkg/mod.py'>
<module 'pkg.mod2' from '/home/cs/tt/test/pkg/mod2.py'>
'''
-
level
指定导入模块的方式。
level为0则绝对导入; level为正值则表示相对于调用__import __()的模块目录,要搜索的父目录数 -
globals和locals
通常使用默认值。使用给定的globals和locals变量来决定如何在一个包上下文中解析name,标准的启用中根本不会使用它的locals 参数,并且它的globals只是用来决定import语句的包上下文