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)
"""

importfrom 导入方式

├── 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()

函数与模块练习-短视频资讯.zip

posted on 2023-10-20 16:49  龙泉寺老方丈  阅读(42)  评论(0)    收藏  举报