导入模块
1、import
2、__import__:
内置函数__import__ 可以动态导入模块,接受字符串作为参数
eg:
mod = __import__('os') # 相当于import os as mod
func = getattr(mod,'walk') # 通过反射获取
func() # 相当于 os.walk()
3、包结构中__init__.py的作用:
从上边的例子可以看出,__init__.py的主要作用是:
1)、Python中package的标识,不能删除
2)、定义__all__用来模糊导入。
模糊导入中的*中的模块是由__all__来定义的,__init__.py的另外一个作用就是定义package中的__all__,用来模糊导入,如__init__.py:
__all__ = ["Pack1Class","Pack1Class1"]
3)、编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)
4、2个模块不要相互导入,这样会导致循环依赖,导入失败。可以创建一个中间位置存放公共变量。
5、通过相对路径导入模块:
假设我们的项目目录结构如下所示:
test ├── a.py ├── b.py └── __init__.py 0 directories, 3 files
在a.py 中我们使用相对路径导入了b.py中的相关变量
from .b import c print (c)
当我们做以下2种操作时:
1)、在test目录中执行python a.py 会报错提示导入失败
Traceback (most recent call last): File "a.py", line 1, in <module> from .b import c ModuleNotFoundError: No module named '__main__.b'; '__main__' is not a packag
这是因为使用了相对路径导入,而直接调用python a.py将导致它不能找到它的父目录. 我们需要跳出该项目所在的目录test, 在test目录外面的其它模块导入a即可,
那为什么不直接使用from b import c 这样的方式导入呢,这样也可以,这样在任何地方直接执行a.py都可以执行成功,但结果是你在test 外面其它的地方导入 a 将失败,这时它会在自己当前的搜索路径中去找,而test不在当前的搜索路径中。