python的脚本、模块、包、库
一、脚本(script)
1.定义:
脚本通常是可直接执行的代码段,由其自身运行。脚本中一般不包含类、函数等。
二、模块(module)
1. 定义
脚本通常是可直接执行的代码段,由其自身运行,模块里面定义了各种函数和类。任何Python模块都可以作为脚本执行。
脚本和模块的重要区别:一个模块当作为模块导入时,文件名用作模块名称的基础,而如果将其作为脚本执行,则模块名为__main__。
2.好处
当作为模块导入时,文件名用作模块名称的基础,而如果将其作为脚本执行,则模块名为__main__。
3. 模块的导入方式
3.1 import
3.2 from模块名 import 成员名
尽量不要使用:from demo import *, 因为这种方式很容易出现名称重复
4. if name == ‘main’:
python模块完成之后,我们需要对模块中的功能进行测试,看看模块的各功能是否正常运行。对于测试代码,我们希望只在直接运行这个py文件时执行,在用其他程序import这个模块的时候不要执行。这时候需要借助python内置的__name__变量。
__name__变量的取值分两种情况
- 当一个模块被直接运行时,name__变量的值为__main。
- 方一个模块被import到其他程序,其他程序运行时,该模块里面的__name__变量的值为运行程序的文件名
因此,可以利用__name__变量结合if语句,让我们实现import某一个模块时,只用模块提供的功能,而不运行模块里面的测试代码:
if __name__ == '__main__':
# test code
5. 模块的说明文档:
模块的说明文档一般以注释的形式放在.py文件的开头,具体格式如下
'''
模块说明文档
'''
可以用模块的__doc__属性来访问模块的说明文档:
import test
print(test.__doc__)
6. 模块的路径
用import语句导入的模块,python会按照以下路径顺序查找需要的模块:
- 当前工作目录;
- PYTHONPATH(环境变量)中的每一个目录;
- python默认的安装目录
如果导入自己写的模块时,路径设置的不对,python解释器会提示找不到这个模块:
ModuleNotFoundError: No module named '模块名'
以上三类目录都保存在标准模块sys的sys.path变量中
解决模块路径不对的三种方法:
- 向sys.path变量中临时添加模块文件所在的完整路径
import sys
sys.path.append(r'D:\xxx\yyy')
- 将模块移到sys.path变量已经包含的路径中
- 修改path系统的环境变量
- 修改用户变量(仅对当前用户生效)
- 修改系统变量(对系统所有用户生效)
python使用path环境时,会先按照系统path变量找,然后按照用户path变量的路径找
三、包(package)
3.1定义
装了一个__init__.py(python3.3以后可以不包含该文件,但是最好还是放如该文件),且含有多个模块的文件夹子。
3.2好处
大型项目中用于管理项目中用到的大量模块
3.3 init.py文件的性质
- 它本身是一个模块
- 这个模块的名字不是__init__,而是这个包的名字,也就是装着__init__.py文件的文件夹的名字
- 他的作用是将一个文件夹变成python模块
- 该文件可以不包含代码,不过此时仅仅用import [该包]形式是什么也做不了的。所以一般会包含一些Python初始化代码,在这个包被import的时候,这些代码会被自动执行。
4.1 初始化代码类型一:批量导入我们需要用到的模块,这样我们就不同在用到的时候再一一导入,方便实用。
4.2 如果我们要使用“from package import *”的形式导入一个模块的所有内容,则需要在__init__.py文件中加上"all = [‘file_a’, ‘file_b’]"。其中,package下有file_a.py, file_b.py文件。
4.3 不建议在__init__.py中写类,以保证py文件简单。
__all__是python中的一个重要变量,放在__init__模块中,用于指定该包被import*时,哪些模块会被import进当前作用域中。不在__all__列表中的模块不会被其它程序引用。我们可以对__all__进行重写。
3.4python包的性质
- 包实质是一个文件夹
- 该文件夹里面可能有__init__.py
- 包的本质依然是模块,因此包里还可以装其它的包
3.5 导入包
跟导入模块格式差不多,只是可能多一个层级
四、库(library)
库是一个抽象的概念,库是一个完整的东西,我们可以认为他是一个完整的项目打包,可直接调用或者运行,一个库中可能有多个包。库由低平台的编译语言实现例如:Cython、C/C++、RPython语言实现的二进制扩展文件(简称轮子),称为库。
五、python中存在的关系
- 数据封装在容器中(列表、元组、字符串、字典)里面
- 代码可以封装在function里面
- function和数据可以封装在class里面
- 上面三类内容可以打包在module里面
- 多个module可以打包在package里面
- 多个package可以打包在library里面