模块和包
1. 模块
所谓的“模块”,其实就是指的py文件!模块之间是可以互相调用的!
在Python中,模块分为三种:
- 系统模块:Python环境安装完成之后自带的py文件或者包
- 自定义模块:就是我们自己写的py文件
- 第三方模块:其他人写好的,上传到 pypi.org 上面,可以下载下来使用的模块
2. 第三方模块下载
下载第三方模块最简单的方式,就是使用 pip 工具来下载。我们在安装Python环境的时候,pip命令已经安装完成了。
在Windows平台上,python解释器的命令就是python,pip工具的命令就是pip。
在mac平台上,python解释器的命令就是python3,pip工具的命令就是pip3。
2.1. 替换国内源
pip可以去搜索和下载仓库中的第三方的模块,但是这些仓库在远端,使用到的是国外的镜像仓库,有些第三方模块在下载的时候可能会比较慢。因此在实际的使用中,我们经常会将镜像源替换成国内的源。
常见的国内的镜像有:
阿里云:http://mirrors.aliyun.com/pypi/simple/
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/
百度:https://mirror.baidu.com/pypi
豆瓣:http://pypi.douban.com/simple/
如果我们在下载第三方模块的时候,临时指定使用指定的源进行下载,可以这样做:
# 指定阿里云的源,下载PyMySQL
pip install -i http://mirrors.aliyun.com/pypi/simple PyMySQL
但是每一次都这样去指定源下载,会非常的麻烦。那么能不能一劳永逸的解决问题?此时我们可以修改配置文件来达到这个效果。
- Windows:
- 需要修改的文件是:C:\Users\{当前用户}\AppData\Roaming\pip\pip.ini,如果没有这个文件,就手动创建一下。
- macOS、Linux:
- 需要修改的文件是:~/.pip/pip.info
写入如下内容,并保存
[global]
index-url=http://mirrors.aliyun.com/pypi/simple
trusted-host=mirrors.aliyun.com
2.2. pip常用命令
# 查看版本
pip --version
# 安装指定的包
pip install PyMySQL # 安装PyMySQL的最新版本
pip install PyMySQL==1.0.4 # 安装PyMySQL的指定版本
# 升级包
pip install --upgrade PyMySQL # 升级PyMySQL,也可以使用==指定版本号
# 卸载包
pip uninstall PyMySQL # 卸载PyMySQL
# 列出已经安装的包
pip list
# 显示安装包的信息
pip show PyMySQL
# 查看指定安装包的详细信息
pip show -f PyMySQL
2.3. 模块之间的互相调用
模块之间是可以互相调用的,在使用之前要先引入指定的模块。引入的语法有三种:
# 1. 使用模块中的内容的时候,需要使用 模块名.内容
import 模块名
# 2. 使用内容的时候,直接操作即可
from 模块名 import 内容1, 内容2
# 3. 引入模块中的所有内容,需要注意的是如果模块下使用了 __all__规定了对外够哦那个开的内容,那么只能够引入这些内容
from 模块名 import *
# my.py
__all__ = ['test_method']
class NumberTool:
@staticmethod
def add(*args):
s = 0
for n in args:
s += n
return s
def test_method():
print("test_method")
# use1.py
import my
print(my.NumberTool.add(10, 20, 30)) # 需要使用 模块.内容 的方式来访问
print(my.test_method())
# use2.py
from my import NumberTool
print(NumberTool.add(10, 20, 30)) # 可以直接使用内容来访问
# test_method() # 这个函数是访问不到的
# use3.py
from my import *
test_method() # 直接访问,但是只能访问到 __all__ 中定义的部分
3. 包
一个py文件就是一个模块,那么将多个具有相关联的功能的模块组织到一起,就是一个包。其实包和目录的功能类似,都可以将若干个功能相似的模块组织到一起,我们在使用到这些模块的时候,就可以直接通过这样的目录结构,找到对应的模块来使用。
包和文件夹的区别,目前也就是包下会有一个 _init_.py 的文件了。
可以理解为,包含 _init_.py 的文件夹就是包,不包含的就是普通的文件夹。
在Python2的版本中,没有_init_.py的时候,是无法导入这个包下的模块中的内容的。
但是Python3中已经不限制了,有没有_init_.py都可以正常导入包下的模块中的内容。
那么,这个_init_.py文件是干嘛的?
其实现在就只有一个预加载的作用了。我们在导入一个包的时候,会先执行这个包下的_init_.py文件中的代码。因此我们就可以在这个文件中进行一些预处理操作。