目录
一、包与模块
二、第三方包的安装
2.1 pip install
2.2使用 curl + 管道
2.3其他安装方法
三、导入单元的构成
3.1pip的使用
四、模块的缓存
一、包与模块
Python 中除了函数库以外,还有非常多且优秀的第三方库、包、模块。
- 模块Module:以
.py
为后缀的文件,称之为 模块 - 包Package:即文件夹,传统包里有一个
__init__.py
文件。可以为空文件,但一定要有该文件,它是包的标志性文件,在需要情况下可以在里面进行一些包的初始化工作。 - 库:一定功能的代码集合
库->包->模块,是从大到小的层级关系:
库:一个库可能由多个包和模块组成
包:一个包可能由多个模块组成
模块:一堆函数、类、变量的集合
(1)模块
假设有一个demo.py文件(也即是模块),代码如下:
name="Python编程时光"
print("导入成功")
使用 import 语句就可以导入demo模块,导入之后,就可以使用 模块名.变量名
的方式访问这个变量。
import demo #执行此语句就会输出:导入成功print(demo.name) # 输出:Python编程时光
当该模块被导入后,会在当前目录下产生一个 叫做 __pycache__
的缓存文件夹。
- 导入模块的时候,Python解释器会把模块的代码编译成字节码,并放入
__pycache__
文件夹中。 - 再次运行的话,如果被调用的模块未发生改变,那就直接跳过编译这一步,直接去
__pycache__
文件夹中去运行相关的 *.pyc 文件,大大缩短了项目运行前的准备时间。
(2)包
传统包里的 __init__.py
可以为空文件,但一定要有该文件,它是包的标志性文件,在需要情况下可以在里面进行一些包的初始化工作。
一个包里可以有多个模块,比如上面的 foo.py
和 bar.py
都属于 demo 模块
import demo.foo #方式一
import demo.barfrom demo import foo #方式二
当我们 import 导入模块或包时,Python 提供两种导入方式:
相对导入(relative import ):from . import B 或 from ..A import B,其中.表示当前模块,..表示上层模块
绝对导入(absolute import):import foo.bar 或者 from foo import bar(标准推荐)
二、第三方包的安装
2.1 pip install
pip 是最主流的包管理方案,使用 pip install xxx
就可以从 PYPI 上搜索并安装 xxx
(如果该包存在的话)。
一些安装示例:pip的更多使用方法
pip install requests# 前提你得保证你已经下载 pkg 包到 /local/wheels 目录下
pip install --no-index --find-links=/local/wheels pkg# 所安装的包的版本为 2.1.2
pip install pkg==2.1.2# 所安装的包必须大于等于 2.1.2
pip install pkg>=2.1.2# 所安装的包必须小于等于 2.1.2
pip install pkg<=2.1.2
2.2使用 curl + 管道
一些第三方工具包提供的安装方法,是直接使用 curl 配置管道来安装,比如上面提到的 poetry 就可以用这种方法安装。
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
2.3其他安装方法
第三方包的其他安装方式
三、导入单元的构成
导入的单元可以是:模块(单个文件)、包、变量、库等
模块:类似 *.py,.pyc, *.pyd ,.so,*.dll 这样的文件,是 Python 代码载体的最小单元
Python 提供两种导入方式:
相对导入:from . import B 或 from ..A import B,其中.表示当前模块,..表示上层模块(python2.6之前的版本常使用的方式)
绝对导入:import foo.bar 或者 from foo import bar(python2.6之后的版本常使用的方式)
导入的注意事项:
- import语句应该分行写入,避免用逗号分隔,出现一行多个的情况
- 绝对导入:如:from foo.bar import test
- import 放文件头部,置于模块说明及docstring之后,全局变量之前
- import导入顺序:内置模块、第三方库、本地模块
3.1pip的使用
(1)查询软件包
- 查看当前环境安装的所有软件包:pip list
- 查询 pypi 上含有某名字的包:pip search pkg
- 查询当前环境中可升级的包:pip list --outdated
- 查询一个包的详细内容:pip show pkg
(2)下载软件包
(3)安装软件包
pip install 包名
- 指定版本安装:
# 所安装的包的版本为 2.1.2
pip install pkg==2.1.2# 所安装的包必须大于等于 2.1.2
pip install pkg>=2.1.2# 所安装的包必须小于等于 2.1.2
pip install pkg<=2.1.2
- 管理控制整个python环境的包版本
# 导出依赖包列表
pip freeze >requirements.txt# 从依赖包列表中安装
pip install -r requirements.txt# 确保当前环境软件包的版本(并不确保安装)
pip install -c constraints.txt
(4)升级软件包
pip install --upgrade pkg
(5)配置文件
由于pip安装包时,默认使用pip官方源,经常会出现网络超时失败的情况,因此我们需要使用国内镜像源来解决:将镜像源配置到pip配置文件中,就省去了每次手动配置镜像源的麻烦:
查找配置文件:使用win+r
输入 %APPDATA%
进入用户资料文件夹,查看有没有一个 pip 的文件夹,若没有则创建pip文件夹,然后新建一个配置文件pip.ini。(镜像源可更换,选择速度较快的即可)
pip的配置文件(pip.ini):
[global]
time-out=60
index-url=https://pypi.tuna.tsinghua.edu.cn/simple/
[install]
trusted-host=tsinghua.edu.cn
(6)pip常用的命令:
参考链接:下图参考链接
3.2模块的缓存
重复导入相同的模块,不会执行多次,只会执行一次导入操作。因为 sys.modules
的存在,会扫描当前是否已经存在该模块。sys.modules
是一个字典(key:模块名,value:模块对象),它存放着在当前 namespace 所有已经导入的模块对象。
3.3源码包与二进制包
Python 包的分发可以分为两种:源码包、二进制包
- 源码包本质是压缩包,常见的格式有:(.zip)、(.tar.gz)、(.tar.bz)、(.tar.z)、(.tar)
- 二进制包省去了编译的过程,直接可解压安装,安装较快。但是不同平台变异的包不同,不通用。常见的格式有:egg(.egg)、wheel(.whl)
Wheel 的出现是为了替代 Egg,它的本质是一个zip包
Wheel 和 Egg 的主要区别:
Wheel 有一个官方的 PEP427 来定义,而 Egg 没有 PEP 定义
Wheel 是一种分发格式,即打包格式。而 Egg 既是一种分发格式,也是一种运行时安装的格式,并且是可以被直接 import
Wheel 文件不会包含 .pyc 文件
Wheel 使用和 PEP376 兼容的 .dist-info 目录,而 Egg 使用 .egg-info 目录
Wheel 有着更丰富的命名规则。
Wheel 是有版本的。每个 Wheel 文件都包含 wheel 规范的版本和打包的实现
Wheel 在内部被 sysconfig path type 管理,因此转向其他格式也更容易
wheel 包可通过 pip 安装,需要先安装 wheel 模块,然后再使用 pip 的命令:
pip install wheel
pip wheel --wheel-dir=/local/wheels pkg