03-Python-包&模块-包和模块的一般操作

学习地址:

撩课-Python大数据+人工智能1
撩课-Python大数据+人工智能2
撩课-Python大数据+人工智能3
撩课-Python大数据+人工智能4
撩课-Python大数据+人工智能5
撩课-Python大数据+人工智能6
撩课-Python-GUI编程-PyQt5

1.包/模块的创建

创建模块

 直接创建一个.py文件即可

创建包

  创建一个文件夹, 文件夹内务必创建一个__init__.py这个文件
  其实3.3版本往后可以不用创建
  但是为了代码版本兼容, 以及做一些其他包处理操作, 目前还是建议创建
  __init__.py文件作用
  第一次导入这个包的时候, 都会自动的执行这个文件

创建多层级包

			在包里面直接创建另外一个包即可, 可以无限级嵌套

包/模块的基本信息

		包和模块名称
			模块名称
				去除.py后缀名后的文件名称
				例如
					sz.py
						是一个模块
					模块名称是
						sz

包名

      文件夹名称
		包和模块的存放位置
			import os
			print(os.__file__)
				会打印os模块所在路径
		查看包和模块里面的内容
			dir(模块/包名称)
	导入包/模块的方式
		友情提醒
			这一块知识点本身比较碎; 需要自己多做实验慢慢体会掌握

理论基础

	导入模块的作用
	可以使用这个模块里面的内容

2.常规导入

			方式
				import M
					导入单个模块
					解释
						M
							模块
							如果是某个包里的模块, 可以通过点语法来定位
				import M1, M2
					导入多个模块
					解释
						M1
							模块
								如果是某个包里的模块, 可以通过点语法来定位
						M2
							模块
								如果是某个包里的模块, 可以通过点语法来定位
				import M as 别名
					导入模块时,给模块起个别名
					应用场景
						简化资源访问前缀
							例如
								源码
									调用资源时
										xx1.xx2.xx3.xx4.资源
									import xx1.xx2.xx3.xx4
								优化后
									import xx1.xx2.xx3.xx4 as hehe
									调用资源时
										hehe.资源
						增加程序的扩展性
							例如
								if file_extension == "txt":
	import txt_parse
	txt_parse.open()
	txt_parse.read()
	txt_parse.close()
elif file_extension == "doc":
	import doc_parse
	doc_parse.open()
	doc_parse.read()
	doc_parse.close()
								优化后
									if file_extension == "txt":
	import txt_parse as parse
elif file_extension == "doc":
	import doc_parse as parse

parse.open()
parse.read()
parse.close()
			注意
				使用时,需要指明资源的模块名称
					例如:p1.my_moudle.run()
			补充
				如果导入的是一个包
					默认不会导入任何模块
					解决方案
						1. 在__init__文件中, 再次导入需要的模块
						2. 应该以from ... import ... 的形式导入

from语句导入

			作用
				想要导入一个模块或包中的某个部分
				从哪里, 导入哪些资源到当前位置
			语法
				from A import B [as C]
					理论(sz)
						明确一点
							只能从大的地方找小的东西
							从盆里面找碗是可以
							反之, 从碗里面找盆就有问题
						按照大小顺序可以将几个资源排序
							包 > 模块 > 模块资源
						注意面向关系
							模块里面只能看到模块资源
					最终组合
						包里面只能看到模块
							看不到模块资源
						1. 从包中导入模块
							单个
							多个
							起别名
							包有多层级
						2. 从模块中导入模块资源
							单个
							多个
							起别名
							模块有多层级
					注意
						保证B部分路径最简
							原则: 从那里能看到谁才能导入谁
						举个栗子
							from 大包 import 小包.模块
								from 大包.小包 import 模块
							from 包 import 模块.子资源
								from 包.模块 import 子资源
			特例
				from 模块 import *
					* 代表是所有非下划线_开头资源导入到当前位置
					配合__all__
						是一个列表
							__all__ = ["a", "run", "Person"]
							列表中每个元素都是字符串
						代表到时*能匹配到的资源
					慎用
						因为你无法预知到时会导入哪些内容到当前位置,容易产生变量名冲突
				from 包 import *
					会识别__init__文件中__all__列表中的指定模块

注意

			1. 导入模块后具体做了什么事?
				第一次导入时
					1. 在自己当下的命名空间中, 执行所有代码
					2. 创建一个模块对象, 并将模块内所有顶级变量以属性的形式绑定在模块对象上
					3. 在import的位置, 引入import后面的变量名称到当前命名空间
				第二次导入时
					直接执行上述第3步
				结论
					注意: 两种导入方式都会大致执行以上的步骤
					1. 多次导入模块, 该模块并不会执行多次
					2. 两种导入方式不存在哪一种更省内存
						区别在于把哪一部分内容拿到当前位置来用
			2. 从哪个位置找到需要导入的模块?
				第一次导入时
					按照模块检索路径顺序去找
						第一级
							内置模块
						第二级
							sys.path
								构成
									当前目录
										import os
										os.getcwd()
									环境变量 PYTHONPATH 中指定的路径列表
									特定路径下的.pth文件中的文件路径列表
										查看特定路径
											import site
											print(site.getsitepackages())
										后缀名为.pth文件
											名称随意
											一个路径占一行
									在 Python 安装路径的 lib 库中搜索
								注意
									自己测试优先级顺序
							追加路径的方式
								1. 直接修改sys.path
									只作用于本次
								2. 修改环境变量
									PYTHONPATH
									注意
										仅仅在shell中有效
										pycharm需要另外一种设置方式
								3. 添加.pth文件
				第二次导入时
					从已经加载过的模块中去找
					查看已加载模块
						import sys
						sys.modules
			3. 导入模块的常见场景?
				局部导入
					在某个局部范围内导入模块
						在其他范围无法使用
					所以,如果想要全局范围都能使用,在文件顶部导入相关模块
					使用场景
						当一个模块使用并不频繁, 而且导入时间过长时
				覆盖导入
					场景1
						自定义模块和非内置的标准模块重名
							根据前者存储位置, 有可能前者会覆盖后者
						结论
							自定义模块命名不要与后者重名
					场景2
						自定义模块和内置模块重名
							内置肯定覆盖自定义
						你又特别想用自定义模块
							使用from...import... 指明绝对路径进行导入
				循环导入
					假设有两个模块A, B
					模块A内导入了模块B; 模块B内也导入了模块A;这样就造成了循环导入
				可选导入
					概念
						两个功能相近的包, 根据需求优先选择其中一个导入
					场景
						有两个包A和B都可以实现相同的功能
						想优先使用A; 而且需要做到在没有A的情况下, 使用B做备选
					实现
						使用try...except...进行实现
				包内导入
					绝对导入和相对导入
						理论
							Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的
							包内导入即是包内的模块导入包内部的模块
						概念
							绝对
								参照sys.path路径进行检索
								例如
									指明包名或模块名
										import a
										from a import b
								注意
									以上结论基于Python3.x之后
							相对
								使用.来指代相对路径
									.
										根据模块名称所获取的当前目录
									..
										根据模块名称所获取的上层目录
								例如
									from . import a
									from .. import a
								注意
									解释器是根据模块名称而确定层级关系, 并不是存放目录
									可以通过__name__来查看模块名称
						补充
							Python3.x版本之前, 直接import a
								优先从本地当前目录查找, 并非是sys.path
								解决方案
									from __future__ import absolute_import
									使用上述语句, 改变import 行为
						结论
							正确用法
								包内导入
									使用相对导入
								包外导入
									使用绝对导入

三方包/模块的安装和升级

		理论
			1. 为什么要安装三方模块?
				因为标准模块有时不能满足我们的需求
			2. 三方模块和标准模块的区别和联系?
				首先,两者都是为了完成某个功能需求
				标准模块
					由官方发布
					使用可靠,几乎没有bug,即使有也有团队立即修复
					有健全的使用文档说明
				三方模块
					由网友提供,可能有如下缺点
					文档不健全
					更新不及时或者根本不更新
					功能有bug
			3. 为什么标准模块不做的超级全?
				每个人的需求不同,做并集会导致整个文件非常庞大,你愿意一次性下载好几个G而且有可能根本用不到文件吗?
				所以,做了需求的交集;大多数人都需要的功能被放到了标准模块
			4. 什么叫模块的安装?
				三方模块本质就是别人写的代码
				所谓安装,就是想办法把这个代码搞到本地,让我们可以来用
			5. 安装的方式?
				源码安装
					自己手动去某个地方去下载,然后安装到本地
				包管理器安装
					更加简单的自动化的为用户安装管理包和模块
					只需要一个或几个命令就可以完成
			6. 包管理项目简史
				distutils
					产生背景
						三方库的存在是必然
						为了让用户更好的使用和管理三方库,官方就开发了这个项目
						1998-2000
					角色定位
						属于Python标准库(官方发行)
					功能特点
						只需要通过合适的命令运行一个叫做setup.py的文件即可
						只能处理简单的包安装
				setuptools
					产生背景
						自从distutils开发停止之后,一些开发人员在它的基础之上进行开发自己的工具
						其中最成功的的就是setuptools
							说明还有其他很多不太成功的
					角色定位
						属于三方库
					功能特点
						更加频繁的更新
						更多的高级功能
							自动依赖处理
							egg分发格式
							easy_install命令
						与distutils的兼容
				distribute
					产生背景
						setuptools开发变缓慢了(不支持Python3),以为会如同distutils一样停止开发
						另一批开发人员又基于setuptools(fork)创建了名为distribute的库
					角色定位
						依然是三方库
					功能特点
						bug更少
						支持Python3
					现状
						2013年setuptools和distribute两个开发组织决定再次合并到setuptools项目中
						所以,distribute被废弃
							setuptools又成了正主
				...
					目前为止有很多包管理工具
						disutils2
						distlib
						...
					但是官方支持的且认可度高的就两个
						distutils
							官方标准库
							从python2 到python3.6全部内置支持
						setuptools(合并distribute后的)
							三方库
							部分 Python 子社区已然是事实上的标准
					更多包管理项目请看
						https://packaging.python.org/key_projects/
				总结
					distutils
						是标准库的一部分
							能处理简单的包的安装
						通过setup.py进行安装
					setuptools
						现在的包安装标准
							曾经差点被废弃,现在有继续开发
						自带了一个easy_install 安装脚本
							后来出现个更牛逼的pip安装脚本来替代它
						引入了.egg格式
							后来出现个更好的whl格式来代替它
					setuptools是目前的主要选择
			7. 常见已发布三方包和模块的形式?
				源码
					单文件模块
					多文件模块(由包管理工具发布的项目)
						基于distutils工具发布的项目特点
							包含setup.py文件
						setuptools也是基于distutils
				.egg
					setuptools引入的一种格式
					setuptools可以识别它,安装它
				.whl
					本质是.zip格式
					是为了替代egg
			8. 安装方式
				本地安装
					对于单文件模块
						直接拷贝到相关文件夹就可以
					对于带setup.py的文件
						通过setup.py 脚本即可安装
					.egg文件
						使用setuptools的自带的安装脚本 easy_install进行安装
					.whl
						使用pip进行安装
				远程安装
					easy_install
					pip
					pycharm
				安装源
					Python官方
						https://pypi.python.org/simple
					豆瓣
						http://pypi.douban.com/simple/
					阿里
						http://mirrors.aliyun.com/pypi/simple/
					中国科学技术大学
						https://pypi.mirrors.ustc.edu.cn/simple/
					服务器在国外,所以国内访问有可能非常慢,网络不好
					镜像地址,服务器在国内,所以网络比较通畅,速度快!

模块安装的具体操作

			本地安装
				对于单文件模块
					直接拷贝到相关文件夹就可以
					存放位置
						sys.path中所包含的路径都可以
						一般存放在Lib/site-package文件夹中
				对于带setup.py的文件
					步骤1
						打开命令行工具
					步骤2
						切换到setup.py文件所在的目录
					步骤3
						执行命令python setup.py install
							Python2.x
						执行命令python3 setup.py install
							Python3.x
					注意
						如果项目是使用distutils打包的,上述命令可以直接使用
							因为distutils是Python自带模块,不需要安装
						如果项目是使用setuptools打包的,有可能上述命令会报错
							错误
								
							原因
								setuptools属于三方模块,并非标准模块,所以有可能没有安装
							解决方案
								安装setuptools
						离线安装
							但是有时候, 包, 依赖的三方包
							依然需要联网, 让它自动的给我们下载安装这些三方的包
				.egg文件
					使用setuptools的自带的安装脚本 easy_install进行安装
						要求先安装setuptools
					语法
						easy_install xxx.egg
				.whl
					使用easy_install安装
						语法
							easy_install xxx.whl
					使用pip进行安装
						推荐
						安装pip
							通过easy_install 远程或者本地安装
							远程
								easy_install pip
								自动下载,自动安装
							本地
								.egg
								.whl
								.tar.gz
						语法
							pip install xxx.whl
			远程安装
				概念
					自动的从远程地址检索->下载->安装某个模块
				安装方式
					easy_install xxx
						需要先安装setuptools
					pip install xxx
						需要先安装pip
				疑问
					从哪个地方下载的包安装到本地的?
						默认:https://pypi.python.org/
					安装在本地的哪个地方了?
						一般在Lib/site_packages

模块的其他操作

easy_install

			详细介绍地址
				http://peak.telecommunity.com/DevCenter/EasyInstall
			其他常用操作
				多个Python版本的切换安装
					场景
						如果一台电脑上,既装了Python2.x 也装了 Python3.x
							两个版本环境都装了setuptools, 都可以使用easy_install
						那么,到时候,如何通过easy_install 安装到指定版本的环境中?
					解决方案
						easy_install-N.N
							N.N用于指明安装在哪个Python版本环境中
						例如
							Python2.7.14
								easy_install-2.7 requests
							Python3.6.3
								easy_install-3.6 requests
				安装指定版本包
					场景
						如果一个包有多个版本;而有的项目使用的是某个特定版本,那该如何安装?
					解决方案
						easy_install “库名 限定符 版本[, 限定符 版本]”
							中括号部分代表可选
							库名
								包的名称
							限定符
								<
								>
								<=
								>=
								==
						例如
							easy_install "requests >= 2.14.1"
								安装大于或等于2.14.1版本的最新包
							easy_install "requests > 1.0, < 2.0"
								安装大于1.0 并且小于 2.0的包
							easy_install "requests == 2.14.1"
								安装2.14.1版本的包
								如果已经安装,则切换到这个版本
							...
				升级三方包
					场景
						有些包的作者,修复了之前的某个Bug; 本地需要更新到最新版本
					解决方案
						easy_install --upgrade(-U) 库名
						例如
							easy_install --upgrade requests
				卸载三方包
					场景
						有些已经安装的包,因某些原因,想要删除(比如:使用这个包的项目已经不需要)
					解决方案
						方式1:手动卸载
							删除在easy_install.pth中的包记录
							删除对应的包文件
						方式2:easy_install -m 包名称
							效果
								删除在easy_install.pth文件中对应包的记录
							注意
								并没有真正的把.egg包文件删除
									不删除原因
										方便多版本切换
									强迫症选手可以选择手动删除
								不会删除依赖包
									本身也不应该删除
									因为这个依赖包,有可能也被其他三方包依赖
						补充
							easy_install.pth作用
								记录着当前通过easy_isntall已经安装的模块
									多个版本的模块,值记录最后一次安装的
								用于导入模块时的路径检索
							-m的真正含义
								支持多版本,可在运行时进行切换
									easy_install.pth 对应的库的记录删除
								解释
									不直接指明包的某个版本,使得用户无法直接导入
										删除在easy_install.pth文件中对应包的记录
									用户如果想使用某个版本,需要使用如下步骤
										import pkg_resources
										pkg_resources.require("requests==2.18.4")
										import requests
				切换三方安装源
					场景
						有可能Python官方库的托管平台,服务器在国外的原因,会导致安装速度慢,甚至失败
					解决方案
						easy_install修改文件
							setuptools\command\easy_install.py
								
						安装源
							Python官方
								https://pypi.python.org/simple
							豆瓣
								http://pypi.douban.com/simple/
							阿里
								http://mirrors.aliyun.com/pypi/simple/
							中国科学技术大学
								https://pypi.mirrors.ustc.edu.cn/simple/
							服务器在国外,所以国内访问有可能非常慢,网络不好
							镜像地址,服务器在国内,所以网络比较通畅,速度快!

pip

			详细介绍地址
				https://pip.pypa.io/en/stable/
			其他常用操作
				切换安装源
					一次性修改
						pip install --index-url https://pypi.douban.com/simple/ requests
							指定检索
							仅仅只到某一个地址检索指定包
						pip install --extra-index-url https://pypi.douban.com/simple/ requests
							扩展检索
							除下到官方的pypi地址检索,也会到扩展的地址检索
					永久性修改
						在c://users/你的用户名/下
							创建pip文件夹
							在pip文件夹中创建pip.ini文件
						文件内容
							[global]
							index-url = http://pypi.douban.com/simple/
							[install]
							trusted-host=pypi.douban.com
					安装源
						Python官方
							https://pypi.python.org/simple
						豆瓣
							http://pypi.douban.com/simple/
						阿里
							http://mirrors.aliyun.com/pypi/simple/
						中国科学技术大学
							https://pypi.mirrors.ustc.edu.cn/simple/
						服务器在国外,所以国内访问有可能非常慢,网络不好
						镜像地址,服务器在国内,所以网络比较通畅,速度快!
				安装在不同的Python版本环境中
					方式1
						python -m pip install requests
						python3 -m pip install requests
					方式2
						py -2 -m pip install requests
						py -3 -m pip install requests
					理论
						Python的安装包实际上在系统中安装了一个启动器py.exe
							C:\Windows\py.exe
						启动器可以调用不同版本的Python去执行某些脚本
							py -2
							py -3
				查看包
					所有已经安装的
						pip list
					不被依赖的包
						pip list --not-required
					过期的包
						pip list --outdated
					查看某个包的具体信息
						pip show xxx
				搜索包
					pip search xxx
					pip search -i 检索地址 xxx
						默认为Python官方的库地址
						 https://pypi.python.org/simple
					例如
						pip search peppercorn
				安装特定版本
					pip install "requests == 2.18"
					pip install "requests >= 2.0"
					pip install "requests > 2.0, < 3.0"
				升级包
					pip install --upgrade xxx
					注意
						pip install xxx
						表示:只有当xxx库不存在的时候,才会安装最新版本
				卸载包
					pip uninstall xxx
						如果是通过easy_install安装的
							会自动删除easy_install.pth文件中对应包路径
							会自动删除对应.egg包的原文件
						如果是通过pip install 安装的,会直接删除对应包文件
				生成冻结需求文本
					场景
						可以将当前安装的三方包记录,存储到指定的文件当中
						以后,就可以根据这个需求文本,去安装三方包
					用法
						pip freeze > requirements.txt
							用来将当前环境下安装的三方包输出到指定文件中
							因为输出的文件,以后是为了让别人通过pip安装
							所以,能看到的列表中自动过滤了pip, setuptools
							可通过 --all参数查看所有包
				根据冻结需求文本安装
					pip install -r requirements.txt

补充

			三方模块的版本规则
			三部分组成n1.n2.n3
				n3
					当版本的bug修复之后,n3 + 1
				n2
					新增了某一个小功能
						n2 + 1
				n1
					修改了之前的功能,或者, 添加了一个新功能(修改了之前的api)
					n1 + 1
			1. 我发布了一个库
				1.0.0
			2.之前发布的库, 出现了一个bug, 然后我再本地修复了这个bug, 并且进行再次的发布
				1.0.1
			3. 往后, 在这个库里面, 新增了一个小功能
				1.1.0
			4.发现1.1.0版本出现了一个bug, 修复 -》 发布
				1.1.1
			4. 新增一个小功能
				1.2.0
			6. 发布了一个超级大的功能, api, 发布
				2.0.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值