包和模块
1 概念
模块:为了使代码更容易维护,提高代码重用价值,可以将一组相关功能的代码写入一个单独的.py
文件中供别人导入使用,这个.py
文件就被称作是一个模块
包:是一个有层次的目录文件结构,它定义了由n个模块或n个子包,包含__init__.py
文件的目录,这个目录下一定要有这个__init__.py
文件和其他模块或子包
库:完成一定功能的代码集合,具体表现可以是一个模块,也可以是包
框架:一个架构层面的概念。从库功能的角度来看,解决一个开放性问题而设计的具有一定约束性的支撑结构。
通过一个框架,可以快速实现一个问题解决的骨架,导师按照框架角色去填充,交互就可以完成一个质量好,维护性噶的项目。例如:Web框架:Flask,Django,…
2 包和模块的作用
1、 编写好一些“轮子”、“工具“代码,供其他模块调用:有效的对程序进行分解,方便代码的管理和维护
2、可以防止同一模块内的命名重复问题
3 包和模块的分类
- 标准包/模块
安装python后,自动帮我们安装好一些模块,可以直接导入使用。每个安装Python的用户电脑上都有这些模块,因此在电脑上写的使用某个系统模块的代码到其他人电脑上,同样能够运行
特殊:内置包/模块
当我们在编码过程中,python会自动帮我们导入的模块,当我们使用这些功能时,不需要手动的导入该模块,直接使用就可以
可以通过import __bulitin
或者dir(__builtin__)
查看内置包/模块
-
第三方/模块
有些功能,系统模块没有实现,或者实现了但是我们用起来比较复杂,因此会有开发人员开发一些使用更为方便的模块供其他开发人员使用(可能也使用到了系统的某些模块,可能没有使用)。那么对于其他开发人员而言,只需要下载安装即可(注意:如果你的代码使用了某个三方模块,在将代码拷贝给别人后,对方也需要事先安装同样的第三方模块后才能运行) -
自定义包/模块
我们自己写的一些好用的模块,发布出去给别人用,就成了第三方/模块
4 包和模块的一般操作
4.1 包和模块的创建
-
创建模块
创建一个.py
文件就可以 -
创建包
创建一个文件夹,文件夹内务必创建一个__init__.py
文件(在python3.3版本之后可以不用创建,但是为了保证版本兼容,以及一些其他包处理操作,目前最好建议创建)
4.2 包/模块的基本信息
-
包和模块名称
就是文件名称
-
包和模块的存放位置
查看标准模块的位置:
os.__file__
-
查看包和模块里面的内容
查看模块中有哪些内容:dir(os)
4.3 导入包/模块的方式
-
理论基础
导入模块的作用:可以使用这个模块里面的内容 -
常规导入
方式1:import M
导入单个包
解释:M是一个包,如果是要访问该包中的某个模块,可以通过点语法导入import M.m
方式2:import M1,M2
方式3:import M as 别名
导入模块时,给模块起个别名
应用场景:简化资源访问前缀;增加程序的扩展性注意:使用时,需要指明资源的模块名称 例如:
py.my_module.run()
补充:如果导入的是一个包,默认不会导入任何模块
解决方案:方案一:在__init__
文件中,再次导入需要的模块;
方案二:以from ... import ...
形式导入 -
from
语句导入
作用:想要导入一个模块或包中的某个部分
语法:from A import B [as C]
注意面向关系:包里面只能看到模块看不到模块资源;模块里只能看到模块资源
注意:导入时保证B部分路径最简;原则:从哪里能看到谁才能导入谁
举例:from 大包 import 小包.模块
这种写法就是错误的
特例:from 模块 import *
,from 包 import *
*
代表是所有非下划线_开头资源导入到当前位置(没有__all__
时)
配合__all__=['a','run']
,这是一个列表,列表中每个元素都是字符串代表到时*能匹配到的资源
慎用:因为你无法预知到时会导入哪些内容到当前位置,容易产生变量名冲突
- 注意
-
导入模块后具体做了什么事?
第一次导入时:在自己当下的命名空间中,执行所有代码;创建一个模块对象,并将模块内所有顶级变量以属性的形式绑定在模块对象上;在import
位置,引入import
后面的变量名称到当前命名空间第二次导入时:直接执行第一次导入时的第三个步骤注意:两种导入方式都会大致执行以上的步骤
1、多次导入模块,该模块并不会执行多次
2、两次导入方式不存在哪一种更省内存:区别在于把哪一部分内容拿到当前位置来用 -
从哪个位置找到需要导入的模块?
第一次导入:按照模块检索路径找
第一级:内置模块 第二级:
sys.path
:构成:1、当前目录:import os
,os.getcwd()
2、 环境变量PYTHONPATH指定的路径列表
3、 特定路径下的.pth
文件中的文件路径列表
4、在Python安装的lib
库中搜索注意:自己测试优先级顺序
追加路径的方式:1、直接修改
sys.path
-> 只作用于本次
2、修改环境变量:PYTHONPATH -> 注意:只在shell中有效,pycharm需要另外一种设置方式 3、添加
.pth
文件当自己定义的类与内置模块中冲突,会自动找内置模块中的函数,因为内置模块的类比自定义的优先级要高
第二次导入:从已经加载过的模块中去找
查看已加载模块:import sys
,sys.modules
-
导入模块的常见场景?
- 局部导入
在某个局部范围内导入模块,在其他范围内无法使用。因此,如果想要全局范围内都能使用,在文件顶部导入相关模块 - 覆盖导入
场景:自定义模块和非内置的标准模块重名 - 循环导入
- 可选导入
- 包内导入
- 局部导入
5 三方包和模块
5.1 理论
1、为什么要安装三方模块:因为标准模块有时不能满足我们的需求
2、三方模块和标准模块的区别和联系?
(1)两者都是为了完成某个功能需求
(2)标准模块:由官方发布,使用可靠,几乎没有bug,即使有也有团队立即修复,有健全的使用文档说明
(3)由网友提供,可能文档不健全,更新不及时或者根本不更新,功能有bug
3、为什么标准模块不能做全?
每个人的需求不同,做并集会导致整个文件非常庞大,你愿意一次性下款好几个G而且有可能根本用不至文件吗?
所以,做了需求的交集:大多数人都需要的功能被放到了标准模块
4、什么叫模块的安装?
三方模块本质就是别人写的代码,所谓安装,就是想办法把这个代码搞到本地,让我们可以来用
5、安装的方式?
方式一:源码安装 -> 自己手动去某个地方下载,让我们可以用
方式二:包管理器安装 -> 更加简单的自动化的为用户安装管理包和模块,值需要一个或几个命令就可以完成
6、包管理项目简史
distutils
:1998-2000
setuptools
distribute
…
7、常见已发布三方包和模块的形式?
源码:单文件模块 / 多文件模块
.egg
.whl
:本质是.zip
格式
三方包网址:https://pypi.org/
8、安装方式
(1)本地安装
对于单文件模块:直接拷贝到相关文件就可以
对于带setip.py
文件:通过setup.py
脚本可安装
.egg
文件:使用setuptools
自带的安装脚本easy_install
进行安装
.whl
文件:使用pip
进行安装
(2)远程安装
easy_install
pip
(3)安装源
Python官方 :服务器在国外,所以国内访问有可能非常慢
豆瓣、阿里、中国科学技术大学:国内服务器,网络通畅
5.2 模块安装具体操作
-
对于单文件模块:直接拷贝到相关文件就可以
存放位置:sys.path
中所包含的路径都可以,一般存放在Lib/site_package
文件夹中 -
对于带
setip.py
文件:通过setup.py
脚本可安装
step1:打开命令行工具
step2:切换到setup.py
文件所在的目录
step3:执行命令python setup.py install
,对于python2.x
;执行命令python3 setup.py install
,对于python3.x
注意:如果是使用
distutils
打包的,上述步骤可使用;如果是使用setuptools
大包的,可能会报错 -
.egg
文件:使用setuptools
自带的安装脚本 -
easy_install
进行安装 -
.whl
文件:使用pip
进行安装-
注意:要先安装
pip
(但是一般安装了python,都会安装了pip) ->安装:easy_install pip
或者找到pip
的.tar.gz
或者.whl
所在路径,然后easy_install 路径
-
pip --version
:查看版本 -
pip install .whl所在路径
-
5.3 pip
安装
python3 -m pip install 包
python -m pip install 包
注意:-m
是以脚本运行
或者
py -3 -m pip install 包
py -2 -m pip install 包
- 查看包:
pip list
- 查看不依赖的包:
pip list --not required
- 查看过期的包:
pip list --outdated
- 查看某个包的具体信息:
pip show xxx
- 检索包:
pip search xxx
- 安装特定版本:
pip install "xxx == 版本号"
或者pip install xxx < 版本号
或者pip install "xxx >= 版本号,< 版本号"
- 升级包:
pip install --upgrade xxx
- 降低版本:
pip install "xxx == 版本号"
- 卸载包:
pip uninstall xxx