问题引入:
在XXX项目的podmanager模块中引用oslo模块代码
例如引用oslo中的配置模块,一般代码编写通过下面代码先导入相关模块:
from oslo.config import cfg
但使用过程中却报cfg模块不存在异常。
问题分析:
首先,弄清楚什么是包,什么是模块。
模块(module):用来从逻辑上组织Python代码(变量、函数、类),本质就是后缀为py的文件。
包(package):定义了一个由模块和子包组成的Python应用程序执行环境,本质就是一个有层次的文件目录结构(必须带有一个__init__.py文件)。
导入什么模块就直接import什么模块就可以了,如果从包里导入某个模块就通过from 包 import 包.模块就可以了,导入包一样。
既然通过import能导入包和模块,那么import的实现原理是怎样的呢?查看资料说明import的原理是路径搜索或搜索路径,应该类似于我们用的C语言中的include。以通常的sys模块为例,查看如下:
上面打印有两个含义:当前py文件所在的文件夹和python安装路径。
也就是说直接import的模块必须位于这两个目录,如果不位于这两个目录,import 模块后执行相关操作就会报找不到相关模块问题。
解决办法:
1.把要导入的模块文件放到引用文件相同的目录,一般相同包下的文件都是采用该方式进行导入。
2.把要导入的模块放到安装路径下面目录,因为我本地安装到下面目录,因此为该目录。
C:\Program Files (x86)\Python37-32\Lib\site-packages
3.通过sys.path.append将模块临时加入,如下:
Sys.path.append(模块路径)
import 模块