一、python中的基本概念
1、模块module
模块module:在python中一个.py文件就称为一个模块。当然”.pyo”、”.pyc”、”.pyd”、”.so”、”.dll”也可以,但Python初学者几乎用不到。模块中一般包括定义的函数、类、变量、可执行代码等。module的常见来源有一下三种:①python内置模块(标准库) ② 第三方模块 ③自定义模块。
好处:
(1)使用模块的好处就是大大的提高代码的可维护性;
(2)不用重复造轮子,一个模块编写完毕就可以在其他地方被调用。
(3)使用模块还可以避免函数名和变量名的冲突,相同名字的函数和变量完全可以分别存在于不同的模块中。
2、包package
如果不同人编写的模块名重复了该怎么办?为此python引入了按目录来组织模块的方法,称为包(package)。
举个例子:一个abc.py的文件就是一个名字为abc的模块(module);一个xyz.py的文件就是一个名字为xyz的模块。假设我编写的abc和xyz这两个模块名和其他的模块有冲突。这要怎么办了?其实我们可以利用包来避免模块的冲突。具体而言就是选择一个顶层包名,按照如下目录存放。
引入了包之后只要顶层包名不与别人的冲突,其下的所有模块都不与别人冲突了。现在abc.py模块的名字变成了mycompany.abc,类似的xyz.py的模块名变成了mycompany.xyz。
包package的本质就是一个有层次的文件目录结构。显然我们可以按照这个规则建立多级目录。
注意:每个包目录下面都会有一个_init_.py的文件,这个文件是必须要有的。否则Python只把这个目录当成普通目录而不是一个包。__init__.py可以是一个空文件,也可以有python代码。
二、模块的导入的方法
# 导入一个模块
import model_name
# 导入多个模块
import module_name1,module_name2
# 导入模块中的指定的属性、方法(不加括号)、类
from moudule_name import element1
# 导入多个模块中的指定的属性、方法(不加括号)、类
from moudule_name import element1,element2
# 导入com/tencent/epc/innerprocess包内的cloudcc_pb2模块并重命名为cloudcc
import com.tencent.epc.innerprocess.cloudcc_pb2 as cloudcc
1、import model_name:本质是将module_name.py中的全部代码加载到内存并赋值给与这个模块同名的变量即module_name。导入后我们就可以以module_name.fun1、module_name.fun2的形式来已用模块中的函数、类等了。
2、from module_name import func1,func2:本质是导入module_name模块中的指定变量或者方法到当前文件中。我们直接使用func1、func2就好了。
3、当cloundcc_pb2.py位于com/tencent/epc/innerprocess这个多层次的包结构下时,其对应的模块名就是com.tencent.epc.innerprocess.cloudcc_pb2。
三、模块的导入原理分析与测试
1、python导入模块的三种方式
通常情况下当使用import语句导入模块后,python会按照如下顺序一次查找指定的模块文件。
①查找当前目录,即在当前执行的程序文件所在的目录下查找。
②到环境变量PYTHONPATH下的每个目录查找。
③到python默认的安装目录下查找。
(2)以上所有涉及目录都保存在标准模块sys的sys.path变量中。如下通过查看变量是可以看到指定程序文件支持查找的所有目录。注:第一个''应该就是当前目录了。
cd到对应目录也是能看到里面存在的模块名的,如下随机查看一个:
cd /usr/lib64/python2.7/site-packages
注:由上图可以知道我们给python安装的模块其实就是把对应的源码文件放置在python能够遍历的目录。同样地我们把这个文件复制到执行文件所在的目录也是一样能其效果被使用的(即第一种方式)。
换句话说如果要导入的模块没有存储在sys.path显示的目录中,那么导入该模块并运行程序是python解释器就会抛出“ModuleNotFoundError: No module named '模块名'”异常。显然解决该异常的方法也就比较简单了,分别是:
①向sys.path汇总临时添加模块文件存储位置的完整路径;
②将模块放在sys.path变量中已包含的模块加载路径中;
③设置path系统环境变量。
(3)演示导入模块
准备:创建hello.py文件和say.py文件内容分别如下:
#hello.py
def say ():
print("Hello,World!")
#say.py
import hello
hello.say()
注:其实不创建say.py也行,用shell模式就可以验证。
方式一:模块文件至于当前路径下
①hello.py放置于非当前路径下,进入shell模式执行。
结论:显然异常报错。
②hello.py放置于当前路径下,进入shell模式执行。
结论:显然能够加载并使用。
方式二:设置环境变量(将模块所在源文件路径添加至环境变量)
方式三:将模块保存至sys.path中的某个现有路径下
经过测试也是可以的。
四、使用python内置标准模块
根据前面的描述知道不一定非要安装标准模块,使用源码也是可以的。获取标准模块的源码之后解压缩出来将其放置在执行脚本当前路径下就是可以用的。如下演示pymongo的这种玩法。
1、python之.whl文件
whl文件是以wheel格式保存的python安装包,顾名思义wheel就是轮子的意思。wheel是python发行的标准内置包格式,whl文件实际上是包含了python安装的所有文件和元数据,whl文件本质上就是一个使用zip进行压缩的压缩文件。对于linux系统和.zip文件一样通过unzip解压缩。
2、pymongo下载与使用
搜索 pymongo 下载 一般就能搜索到相应资源。如下就是3.11.1版本的链接。
Python pymongo项目安装包(第三方库)下载资源&安装指南页面 - PyPI - Python中文网
#解压whl文件
unzip pymongo-3.11.1-cp27-cp27mu-manylinux1_x86_64.whl
然后就可以import pymongo、或者执行目标脚本了。
注:之所以这么操作是因为腾讯云的云函数在执行脚本的时候实际上是依赖这些模块的,对于云函数而言目前都是以这种直接上传源码的方式解决依赖。
注:这一招非常好用如果你的代码用到了 import yaml 那就下载这个 yaml2 · PyPI;以此类推。