python学习记录第24天
侧边栏壁纸
  • 累计撰写 29 篇文章
  • 累计收到 32 条评论

python学习记录第24天

xinxin
2023-05-06 / 0 评论 / 4 阅读 / 正在检测是否收录...

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.pybar.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 , 直接导入
'''

1

评论 (0)

取消