【新人系列】Python 入门(二十七):Python 库
✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html
📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Python 的学习。在这个 Python 的新人系列专栏下,将会总结 Python 入门基础的一些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 👍 收藏 📁 关注,您的支持就是我创作的最大动力 💪
1. import 原理
- 搜索路径:当执行 import 语句时,Python 会在一系列预定义的路径中搜索要导入的模块,搜索路径主要按照「内置模块 -> 当前目录 -> 环境变量 -> 标准库目录 -> .pth 文件 -> 第三方库路径」进行搜索。另外也可以通过 sys.path 得方式可以查看和修改的其他路径。
- 内置模块:Python 解释器自带的模块,例如 math、os 等。
- 当前目录:首先会在当前执行脚本所在的目录或所属项目目录中查找模块。
- 环境变量:如果在当前目录中没有找到模块,会继续在 PYTHONPATH 环境变量中指定的目录列表中搜索。
- 标准库路径:Python 安装目录下的标准库模块所在的路径。
- .pth 文件:如果模块仍未找到,Python 会查看安装目录下的 .pth 文件,这些文件包含了额外的搜索路径。.pth 文件的作用和环境变量 PYTHONPATH 一样,都会把路径加到 sys.path。.pth 文件要放在 python 安装目录下的 lib\site-package 文件夹下,一行就代表一个路径。
- 第三方库路径:如果通过 pip 安装了第三方库,通常在 Python 安装目录的 lib\site-packages 目录下。
Tips:
import 的搜索路径有两大步骤:先判断 import 后面的 XXX 包是不是内置模块,内置模块可以直接 import,基本不会报错。如果 XXX 不是内置的,那么就从 sys.path 的列表中依次查找 XXX(注意是依次,即有先后顺序),如果遍历完 sys.path 还找不到 XXX 就抛 ModuleNotFoundError 异常结束。
- 模块查找:Python 会按照指定的名称在搜索路径中查找对应的 .py 文件(对于 Python 模块)或包含 init.py 文件的目录(对于 Python 包)。
- 编译和缓存:如果找到模块并且是 .py 文件,Python 会将其编译为字节码(.pyc 或 .pyo 文件)以提高后续导入的性能。编译后的字节码会被缓存,下次导入时如果模块没有修改,将直接使用缓存的字节码。
- 执行模块代码:在导入模块时,模块中的顶层代码(不在函数或类内部的代码)会被执行,包括变量的定义、函数的定义等。
- 命名空间:导入的模块会在当前的命名空间中创建一个对应的名称,通过这个名称可以访问模块中的内容。
2. 模块与包
2.1 定义
- 模块:在 Python 中,一个 .py 文件就是一个模块,模块让你能够有逻辑地组织你的 Python 代码段。模块能定义函数、类和变量等。
- 包(目录):Python 包是一个分层次的文件目录结构,它定义了一个由模块及子包组成的 Python 的应用环境。简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件,该文件的内容可以为空,init.py 用于标识当前文件夹是一个包。
2.2 导入规范
导入一个模块就起一行,最好不要将多个模块导入放在同一行。另外,import 建议要放在文件头部,一般是放在 docstring 之后,全局变量或正式逻辑代码之前。
# 推荐每一个模块放一行
import os
import sys
import time
# 不推荐放在一行导入
import os, sys, time
尽量按照内置模块、第三方模块和本地模块的顺序导入。
# 内置模块
import os
import time
# 第三方模块
import request
import django
import flask
# 本地模块
import xxx
2.3 导入操作
2.3.1 导入整个模块
加入已经有写好的程序 pizza.py,那么可以通过 import 来调动这个程序,然后通过 import 的模块来调用其中的函数名进行使用:
import module_name
module_name.function_name( )
例如:
import pizza
make_pizza(16, 'mushrooms')
2.3.2 导入特定函数(推荐用法)
可以导入模块中的特定函数,导入后想调用这些函数就不用加上前面的模块名了:
from module_name import function_name
from module_name import function_0, function_1, function_2
function_name()
例如:
from pizza import make_pizza
make_pizza(16, 'mushrooms')
2.3.3 导入模块中的所有函数(不推荐)
通过星号可以将模块中的所有函数都复制到这个程序文件中:
from module_name import *
function_name()
例如:
from pizza import *
make_pizza(16,'pepperoni')
这种方法使用需谨慎,如果模块中有函数的名称与当前项目中使用的名称相同,Python 会覆盖函数。
比如当前项目中有一个叫 func 的函数,然后从某个模块中又通过 “from module_name import *” 导入了一个也叫 func 的函数。那么此时在当前项目中使用 func 时,实际上使用的是从模块中导入的那个 func 函数,而不是原本自己定义的那个。
但是在 my_package/init.py 文件中,可以定义 all 列表来指定当用户执行 from modname import * 时应该导入哪些模块或对象。
例如有如下包结构:
my_package/
__init__.py
module1.py
module2.py
module3.py
并且在 all 这样设置:
__all__ = ['module1', 'module2']
如果 module1.py 中有一个函数 func1,module2.py 中有一个类 MyClass,现在当用户执行 from my_package import * 时,只会导入 module1 和 module2 这两个模块名.
2.3.4 使用 as
- 给函数指定别名
from pizza import make_pizza as mp
mp(16,'pepperoni')
- 给模块指定别名
import pizza as p
p.make_pizza(16,'pepperoni')
Tips:
导入类的方法和导入函数的方法是一致的,只是类名需要需要大写,因此下面就不再过多赘述了~
2.3.5 导入类
已知文件 car.py,从此文件中向另一个文件导入 Car 类:
from car import Car
3. 动态加载
动态加载模块,不需要提前导入相关模块,它可以根据运行条件来选择加载不同的模块,从而增强程序的灵活性和扩展性。
方法一:Python 提供了一个 importlib 模块,可以用于实现动态加载。
import importlib
def test_func():
module_name = 'math'
math = importlib.import_module(module_name)
result = math.sqrt(16)
print(result) # 4.0
test_func()
可以需要选择时机加载模块,按需加载,按需使用,延时加载模块。
另外,importlib 还有一些扩展的用法,但不是必须掌握的,一般用上面那种方法就足够了。对于这个扩展的用法,还是来看一个例子,在下面这个例子中:
- 首先使用 spec_from_file_location 函数创建一个模块规格,指定了模块的名称和文件路径。
- 然后,使用 module_from_spec 创建一个模块对象。
- 接着通过 spec.loader.exec_module(module) 执行模块的代码,将模块加载到内存中。
- 最后,可以使用导入的模块中的函数或属性。
import importlib.util
# 假设要从文件路径为 /path/to/module.py 的文件加载模块
module_path = '/path/to/module.py'
module_name = 'custom_module'
spec = importlib.util.spec_from_file_location(module_name, module_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# 现在可以使用导入的模块
print(module.some_function())
方法二:使用 __import__ 来实现动态加载。
os = __import__('os')
if platform.uname().system == 'Windows':
module = __import__('os')
else:
module = __import__('sys')
4. pip 工具
4.1 官方下载源
Python 包官网地址:https://pypi.org/
Python 语言提供超过 15 万个第三方库,使用 pip 安装。
4.2 国内下载源
官网的包下载速度可能比较慢,因此也可以使用国内的下载源来下载第三方包:
- 阿里云:http://mirrors.aliyun.com/pypi/simple/
- 中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/
- 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
- 中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/
如果要使用国内镜像源配置(以使用国内知名的 Python 镜像源“阿里云”为例),主要有两种方式使用方法:
- 可以在使用 pip 命令安装包时,通过 -i 参数指定镜像源,例如:
pip install 包名 -i https://mirrors.aliyun.com/pypi/simple/
- 永久配置(以配置阿里云镜像源为例):
- Windows 系统:在用户目录下创建一个名为 pip 的文件夹,在该文件夹内创建一个名为 pip.ini 的文件,在文件中添加以下内容。
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
- Linux 或 macOS 系统:在用户目录下创建一个 .pip 文件夹,在该文件夹内创建一个 pip.conf 文件,添加类似上述的内容。
另外,如果想将整个包都下载下来,则可以使用如下命令:
pip download 包名