8.1 【基础】什么是包、模块和库?
Python 中除了函数库以外,还有非常多且优秀的第三方库、包、模块。
那么问题就来了,库、模块和包各是什么意思?
它们之间有什么区别呢?今天就一起来学习下。
1. 模块
以 .py
为后缀的文件,我们称之为 模块,英文名 Module。
模块让你能够有逻辑地组织你的 Python 代码段,把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
假设现在有一个名为 demo.py
的文件,文件内容如下
name="Python编程时光"
print("导入成功")
直接使用 import 语句就可以导入,导入之后,就可以使用 模块名.变量名
的方式访问这个变量。
>>> import demo
导入成功
>>> demo.name
'Python编程时光'
>>>
在导入模块的时候,有一个非常重要的全局变量需要掌握,那就是 __name__
这个变量。
现在把 demo.py
的内容改成
$ cat demo.py
print("__name__ 的值为: " + __name__)
- 当模块被直接执行时,
__name__
的值为__main__
$ python demo.py
__name__ 的值为: __main__
- 当模块被导入时,
__name__
的值为 模块名
>>> import demo
__name__ 的值为: demo
当该模块被导入后,会在当前目录下产生一个 叫做 __pycache__
的缓存文件夹。
$ tree
.
├── __pycache__
│ └── demo.cpython-39.pyc
└── demo.py
这个文件夹有什么用呢?
简单来说,当你导入模块的时候,Python解释器会把模块的代码编译成字节码,并放入 __pycache__
文件夹中。
这样以后再次运行的话,如果被调用的模块未发生改变,那就直接跳过编译这一步,直接去__pycache__
文件夹中去运行相关的 *.pyc 文件,大大缩短了项目运行前的准备时间。
2. 包
在早一点的 Python 版本(Python 3.3 之前)中,如果一个文件夹下有一个 __init__.py
文件,那我们就称之为包,英文名 Package。
在后来的 Python 版本(Python 3.3 开始)中,就没有这个要求了,只要是文件夹就可以当做包,我们称之为空间命名包,为做区分,我把上面那种包称之为 传统包。
今天这节里主要讲讲传统包的内容。
传统包里的 __init__.py
可以为空文件,但一定要有该文件,它是包的标志性文件,在需要情况下可以在里面进行一些包的初始化工作。
$ tree
.
└── demo
├── __init__.py
├── bar.py
└── foo.py
一个包里可以有多个模块,比如上面的 foo.py
和 bar.py
都属于 demo 模块。
如果要使用这些模块,就需要这样导入
>>> import demo.foo
成功导入 foo.py
>>> import demo.bar
成功导入 bar.py
或者这样
>>> from demo import foo
成功导入 foo.py
>>> from demo import bar
成功导入 bar.py
3. 库
Python 库是指一定功能的代码集合,通常认为他是一个完整的项目打包。
库->包->模块,是从大到小的层级关系!
- 库:一个库可能由多个包和模块组成
- 包:一个包可能由多个模块组成
- 模块:一堆函数、类、变量的集合
8.2 【基础】安装第三方包的八种方法
1. 使用 easy_install
easy_install
这应该是最古老的包安装方式了,目前基本没有人使用了。下面是 easy_install
的一些安装示例
# 通过包名,从PyPI寻找最新版本,自动下载、编译、安装
$ easy_install pkg_name
# 通过包名从指定下载页寻找链接来安装或升级包
$ easy_install -f http://pythonpaste.org/package_index.html
# 指定线上的包地址安装
$ easy_install http://example.com/path/to/MyPackage-1.2.3.tgz
# 从本地的 .egg 文件安装
$ easy_install xxx.egg
2. 使用 pip install
pip 是最主流的包管理方案,使用 pip install xxx
就可以从 PYPI 上搜索并安装 xxx
(如果该包存在的话)。
下面仅列出一些常用的 pip install
的安装示例
$ 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
更多 pip 的使用方法,可参考本系列教程后面的文章,介绍得非常清楚:8.8 pip 的详细使用指南
3. 使用 pipx
pipx 是一个专门用于安装和管理 cli 应用程序的工具,使用它安装的 Python 包会单独安装到一个全新的独有虚拟环境。
由于它是一个第三方工具,因此在使用它之前,需要先安装
$ python3 -m pip install --user pipx
$ python3 -m userpath append ~/.local/bin
Success!
安装就可以使用 pipx 安装cli 工具了。
# 创建虚拟环境并安装包
$ pipx install pkg
更多 pipx 的使用方法,可参考本系列教程后面的文章,介绍得非常清楚:12.4 pipx 安装程序的使用指南
4. 使用 setup.py
如果你有编写 setup.py 文件,可以使用如下命令直接安装
# 使用源码直接安装
$ python setup.py install
5. 使用 yum
Python 包在使用 setup.py
构建的时候(具体内容可阅读后面的内容:8.15 超详细讲解 setup.py 的编写),对于包的发布格式有多种选项,其中有一个选项是 bdist_rpm
,以这个选项发布出来的包是 rpm
的包格式。
# 发布 rpm 包
$ python setup.py bdist_rpm
对于rpm
这种格式,你需要使用 yum install xxx
或者 rpm install xxx
来安装。
# 使用 yum 安装
$ yum install pkg
# 使用 rpm 安装
$ rpm -ivh pkg
6. 使用 pipenv
如果你在使用 pipenv 创建的虚拟环境中,可以使用下面这条命令把包安装到虚拟环境中
$ pipenv install pkg
7. 使用 poetry
如果你有使用 poetry 管理项目依赖,那么可以使用下面这条命令安装包
# 直接安装包
$ poetry add pkg
# 指定为开发依赖
$ poetry add pytest --dev
8. 使用 curl + 管道
有一些第三方工具包提供的安装方法,是直接使用 curl 配置管道来安装,比如上面提到的 poetry 就可以用这种方法安装。
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
'''
1、导入包&使用的基本语法
导入:import 包名.模块
使用:包名.模块.功能
from 包名 import 模块
在使用时 模块.功能, 不用带包名
'''
导入包下的模块
import bao.module01
bao.module01.hi()
from bao import module02
module02.ok()
'''
2、导入包的模块的指定函数、类、变量
from 包名.模块 import 函数、类、变量
在使用时,直接调用功能
from 包名.模块 import * :表示导入包的模块的所有功能
'''
from bao.module01 import hi
hi()
from bao.module02 import *
ok()
'''
3、__init__.py 通过__all__控制允许导入的模块
1、在__init__.py 中增加__all__ = [允许导入的模块列表]
2、针对 from 包 import * 方式生效,对 import xx 方式不生效
'''
from bao import *
hi()
ok()
'''
4、快速导入模块的快捷键
1、alt + enter , 提示你选择解决方案
2、 alt +shift +enter , 直接导入
'''
评论 (0)