1. 自定义模块
1.1 模块和包
- 一个py文件,模块(module)
- 含多个py文件的文件夹,包(package)
- 在包(文件夹)中有一个默认内容为空的
__init__.py
的文件,一般用于描述当前包的信息(在导入他下面的模块时,也会自动加载,只加载一次)- py2必须有,如果没有导入包就会失败
- py3可有可无
├── commons
│ ├── __init__.py
│ ├── convert.py
│ ├── page.py
│ └── utils.py
└── run.py
# __init__.py
"""
VERSION = 0.1
print(VERSION)
"""
# page.py
"""
def pagination(name):
return name
"""
# run.py
"""
from commons.page import pagination
v1 = pagination('小明')
print(v1)
# 输出 >>>
# 0.1
# 小明
"""
1.2 导入
当定义好一个模块或包之后,如果想要使用其中定义的功能,必须要先导入才能使用
- 导入,其实就是将模块或包加载的内存中,以后再去内存中去拿
- 写模块名称时,不能和内置和第三方的模块同名
- 项目执行文件一般都在项目根目录,如果执行文件嵌套在内层目录,就需要自己手动在sys.path中添加路径。
- pycharm中默认会将项目目录加入到sys.path中(建议还是自己加上sys.path.append(),因为如果不用pycharm的话代码执行会报错)
导入时的路径:
在Python内部默认设置了一些路径,导入模块或包时,都会按照指定顺序逐一去特定的路径查找。
import sys
print(sys.path)
# 按照显示的列表中的元素 (文件夹) 逐个去找,找到则导入
# 第一个列表元素为 '当前执行脚本所在的目录'
自定义添加指定路径导入:
import sys
sys.path.append("路径A") # 将自己写的代码路径导入到sys中
# 示例:
"""
# 需要导入的文件: /project/demo/commons/page.py
def pagination(name):
return name
"""
"""
# 当前执行脚本: /project/demo/bin/run.py
from commons.page import pagination
v1 = pagination('小明')
print(v1)
"""
# run.py 需要自定义路径才能导入找到commons包,导入page模块
"""
import os
import sys
# 当 run.py 文件在/project/demo目录下时,则不需要sys.path.append
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from commons.page import pagination # 先添加路径再导入
print(sys.path)
v1 = pagination('小明')
print(v1)
"""
import
和 from
导入方式
├── commons
│ ├── __init__.py
│ ├── convert.py
│ ├── page.py
│ ├── tencent
│ │ ├── __init__.py
│ │ ├── sms.py
│ │ └── wechat.py
│ └── utils.py
├── many.py
└── run.py
import
导入(开发中,一般多用于导入sys.path目录下的一个py文件)- 应用场景:导入项目根目录的包、模块
- 成员:代指函数、变量等
# run.py 导入模块
import many
import commons.page
import commons.tencent.sms as tsms # 别名
v1 = many.成员
v2 = commons.page.成员
v3 = tsms.成员
# run.py 导入包
import commons
commons.VERSION # 0.1
from
导入- 应用场景: 导入成员、嵌套的包、嵌套模块
# run.py 导入成员
from many import 成员1,成员2
from many import * # 导入一个模块中所有的成员(可能会重名,所以用的少)
from commons.page import pagination
v1 = pagination('小明')
print(v1)
# run.py 导入模块
from commons import page
v1 = page.pagination('小明')
print(v1)
# run.py 导入包
from commons import tencent # 至少有一个嵌套关系
from
相对导入 (相对导入只能用在包中的py文件中(即:嵌套在文件中的py文件才可以使用,项目根目录下无法使用))
# sms.py 导入 wechat.py
from . import wechat
# sms.py 导入 page.py
from .. import page
1.3 导入别名
如果项目中导入 成员/模块/包 有重名,那么后导入的会覆盖之前的导入,为了避免这种情况的发生,Python支持重命名,即:
import commons.page as pg
v1 = pg.pagination()
1.4 主文件
- 执行一个py文件时:
__name__
=__main__
- 导入一个文件时:
__name__
=模块名
# run.py
print(__name__) # __main__
# page.py
print(__name__) # __main__
# 执行run.py
from commons import page
if __name__ == "__main__":
print(__name__)
"""
commons.page
__main__
"""
- 开发规范:主文件示例
# 主文件
def xxx(): # 将代码都写到函数里
...
...
...
if __name__ == "__main__":
xxx()
# 模块中也可引入 if __name__ == "__main__": 做调试功能
2. 第三方模块
Python内部提供的模块有限,所以在平时在开发的过程中,经常会使用第三方模块。
第三方模块必须要先安装才能可以使用
使用第三方模块就是去用别人写好并开源出来的py代码拿来用,不必重复造轮子了
模块的安装目录(在sys.path中):site-packages
2.1 pip
pip是一个第三方模块包管理工具,默认安装Python解释器时自动会安装
某些情况没有找到pip,也可以自己手动安装:
# 下载 get-pip.py 文件,到任意目录
wget https://bootstrap.pypa.io/get-pip.py
# 安装
python3.7 get-pip.py
# pip 更新
pip install --upgrade pip
# 使用其它源安装
"""
阿里云: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/
豆瓣:https://pypi.douban.com/simple/
"""
pip3.7 install 模块名称 -i https://pypi.douban.com/simple/
# 永久使用xx源 ( 执行完本地配置文件就会写入豆瓣源 )
pip3.7 config set global.index-url https://pypi.douban.com/simple/
pip3.7 config set install.trusted-host pypi.douban.com
# 自己以后也可以打开配置文件直接修改源地址 /root/.pip/pip.conf
[global]
index-url = http://pypi.douban.com/simple/
[install]
trusted-host = pypi.douban.com
# 默认安装的 包/模块 是最新的版本,如果想要指定版本:
# pip3 install 模块名称==版本
pip3 install django==3.2
# 下载多个 包/模块可以将模块写入一个文件一起安装
pip3.7 install -r requirements.txt
2.2 源码
如果要安装的模块在pypi.org中不存在 或 因特殊原因无法通过pip install 安装时,可以直接下载源码,然后基于源码安装,例如:
# 下载requests源码(压缩包zip、tar、tar.gz)并解压
# 下载地址:https://pypi.org/project/requests/#files
# 进入目录编译和安装
python3 setup.py build
python3 setup.py install
2.3 whell
wheel是Python的第三方模块包的文件格式的一种,我们也可以基于wheel去安装一些第三方模块
安装wheel格式支持,这样pip再安装第三方模块时,就可以处理wheel格式的文件了
# 安装wheel
pip install wheel
# 下载第三方的包(wheel格式),例如:https://pypi.org/project/requests/#files
# 安装wheel格式的包
pip3.7 install requests-2.25.1-py2.py3-none-any.whl
2.4 练习
- 尝试找一个第三方模块实现某个功能
例如:统计某个目录下所有视频文件的时长
- 进度条
import time
print('开始下载')
for i in range(1, 101):
data = '\r已下载{}%'.format(i)
print(data, end='')
time.sleep(0.1)
print('\n下载完成')
import requests
"""下载并保存视频"""
res = requests.get(
url="https://aweme.snssdk.com/aweme/v1/play/?video_id=v0d00fg10000c820qnrc77u1ofqasjdg&ratio=720p&line=0",
headers={
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 FS"
}
)
file_size = int(res.headers['Content-Length'])
download_size = 0
with open('带土.mp4', mode='wb') as f:
for chunk in res.iter_content(128):
download_size += len(chunk)
f.write(chunk)
print('\r下载进度: {}%'.format(round((download_size / file_size) * 100), 2), end='')
print('\n下载完成')
res.close()