27、python的模块和包的寻址引用分析

  • Python module模块:

我们来讲下Python的模块和包,这部分内容是跟我们后面做扩展息息相关的,因为我们最终做的C++程序就是以模块的方式提供给Python,当然了,还有另外一种方式,就是直接通过动态链接库、通过ctypes来获取,除了这两种方案,当然还有其他方案,方案比较多。
我们主要讲两种方案,一种就是直接动态链接库,通过Python的接口来调用;还有一种就是我们直接编译成Python的模块。
当然了,Python的模块不只是用来做扩展用的,因为Python本身就可以开发自己的模块,Python的模块是什么意思呢?
可以把Python的每一个文件理解成模块,就是一个代码文件就理解成一个模块,那么如何来引用这个模块呢?
在这里插入图片描述

它这个模块可以导入的既是py源码,或者py编译过的,或者是pyd我们的扩展库,注意是扩展库,而不是普通的pyd库,因为普通的pyd库是通过ctypes来获取的。
还有一种导入方法:
在这里插入图片描述
导入一个模块,然后import这个模块里面的一些内容,比方说我们只import里面的一个类,或者import里面的一个函数,或者我们只访问它内部的一个变量。
这个语法除了是可以导入模块之外呢,这个import还可以导入包,我们可以从一个包里面导入它的其中某一个模块。

  • 这两种导入方式的区别:
    第一种方式,如果说我们导入这个module1之后,我们要访问这个模块里面的函数和类,那我们要把这个模块名和.点放在前面;
    第二种这种方式,我们from modname,import name1进来之后呢,我们就可以直接用这个模块内的名称,就不需要前面加模块名和.点了,也就是说把它引入到当前的名称空间中来了,就是在同一个名称空间,这个时候就容易产生冲突了。
    在这里插入图片描述

  • Python的packet:

packet就是在一个目录下面包含一个__init__.py这样一个文件,当你包含了一个包之后,在这个文件里面可以做一些初始化,甚至可以在里面做一些函数,放在我们这个__init__.py文件当中。

在这里插入图片描述
注意一点,如果from module import *的话,它会把这个模块内部的所有函数、变量都导入进来;
而我们在做这个from pack import *的时候,它并不会把所有的模块都导入进来,它会访问__all__这样一个变量,把这个变量里面的模块全部导入进来,所以我们一旦用了import *之后,我们可以在__init__.py文件当中配置这个__all__变量,告诉它我们在这个包里面哪些模块是我需要引用的。

  • __name__属性

获取当前模块的名称。
在这里插入图片描述

通过这种方式我们就可以判断这个模块是被import进来的,还是说是我们直接执行的,如果是直接执行的话,我们要做一些处理,如果是import的时候我们要做哪些处理,这都可以放在我们的模块类当中来去做判断。

  • 模块的导入路径

在这里插入图片描述
前面我们讲了引入模块,甚至引入动态库的模块,引入包,都涉及到目录,那你们有没有想过这个目录到哪边去找呢?

import sys
sys.path	# list

其实这个模块的导入路径在我们Python当中,提供了一个sys模块,有些模块是我们系统自带的模块,里面有一个sys.path,它是一个list,里面存放了我们所有找的路径,就是当我们加载一个模块或者是动态库,我们查找的路径,会在这个list里面存放的路径当中去查找,当然了这个路径也有局限性,像我们做C++扩展的时候,如果涉及到动态链接库又引用了动态链接库的时候,Python是不知道的,只有我们C++知道,所以那个可能还要配到系统路径下;
对所有的Python模块、Python代码的包,我们是可以通过这个路径来设置,假定一个库在多个路径下都有,那它取哪一个呢?
那肯定有一个次序,就是按照list里面的次序,开始的优先级最高,所以如果我们想自己建一个目录,让它到我们这个目录当中来找这个模块,那你可以通过sys.path.insert插入一个路径到list的开始位置,例如:

sys.path.insert(0, "../")

我就定义当前代码的上一层路径,你就到上一层去找我们对应的这个模块,这个设置完之后,你再去import,它就多了一个引导的路径来找到你对应的模块。

猜你喜欢

转载自blog.csdn.net/zhaopeng01zp/article/details/109291817
今日推荐