import是使用python开发过程中最常用到的了。本文对import的使用做一个简单的总结。
如果对所需要的内容很明确的话可以用from…import…即可
import时一般按照下面的顺序搜索所需的包或者模块:
sys.path是模块的搜索路径,是一个列表,按照搜索的顺序保存。
想要添加搜索路径可以通过修改sys.path或者PYTHONPATH,或者添加.pth文件来实现。
python2默认是相对路径导入,python3默认是绝对路径导入。
在没有明确指定包结构的情况下,Python 是根据 name 来决定一个模块在包中的结构的,如果是 main 则它本身是顶层模块,没有包结构,如果是A.B.C 结构,那么顶层模块是 A。基本上遵循这样的原则:
如果是绝对导入,一个模块只能导入自身的子模块或和它的顶层模块同级别的模块及其子模块
如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块
如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。
绝对导入就是从sys.path中各个路径中按照顺序查找包或者模块。
相对导入就是相对于当前包的上级或者下级包。
但是作为主模块的脚本中不能够使用相对导入。主模块也就是作为运行入口的文件。但是主模块可以导入含有相对导入的模块。
怎么解决在主模块中导入包呢?
可以通过设置sys.path的方式来实现。当前路径直接import即可,以上层目录为例说明一下。
sys.path.append(os.path.abspath("..")) #
import tree # 同目录下的直接import,使用 from .tree import xxx会报错
from top_tree import my_class_top #作为主模块不能使用相对路径import
主要有两种方式,直接上代码
def test_dynamic_import():
module_name = __import__("myclass1", fromlist=["A"])
class_name = getattr(module_name, "A")
print(class_name)
from importlib import import_module, reload
module = import_module('myclass1')
#module.
reload(module) # 重新加载模块
func = getattr(module, 'test_func')
print(func)