Python 基础补强(面向「读视觉/Agent 代码」)
用大白话说:这一页帮你搞懂——读你那套视频检测代码、自己写 agent(说人话:能自己想办法、调用工具干活的小助手程序)时,最常用到的 10 个 Python 知识点。
你自述 Python 基础不牢。这一页不教通用语法,只列读你代码、写 agent 必会的 10 个点,每个都标了在你项目里的位置。边读代码边对照学最快。
1. 函数与类
函数(说人话:一段能重复使用的「动作」指令)。类(说人话:把「数据」和「动作」打包在一起的模板,像做狗的模板)。你代码里的 process_stream、LMBatchProcessor 都是类或函数。
class Dog:
def __init__(self, name): # 构造,self 指自己
self.name = name
def bark(self):
return self.name + " 汪"
2. *args / **kwargs(可变参数)
这俩(说人话:让函数能收「数量不定的参数」,框架常用它把参数原样传下去)在框架里到处是,用来透传参数。
def f(*args, **kwargs):
print(args) # 元组:(1, 2)
print(kwargs) # 字典:{'a': 3}
f(1, 2, a=3)
3. 列表推导 / 生成器
这俩是「批量造数据」的偷懒写法。列表推导(说人话:用一行写出「批量生成列表」);生成器(说人话:现做现给,省内存,要一个给一个)。
squares = [x*x for x in range(5)] # [0,1,4,9,16]
gen = (x*x for x in range(5)) # 生成器,省内存,逐个给
4. 上下文管理器 with
它自动管「打开→用完关闭」(说人话:自动帮你「开→用→关」,不怕忘关)。你推流(说人话:像直播一样把视频发出去)写 ffmpeg(说人话:专门处理视频的万能工具)pipe 就用它。
with open("a.txt") as f:
data = f.read() # 退出 with 自动关文件
5. 多线程与队列(你的系统核心)
帧(说人话:视频里的一张图,像电影的一格)threading(多线程,说人话:让程序同时干好几件事)+ queue.Queue(队列,说人话:排队的传送带,一头放、一头取)就是你的 push_stream 线程 + frame_queue。背压(说人话:前面放太快、后面取不及,被堵住)就发生在这里。
import threading, queue
q = queue.Queue(maxsize=10)
def worker():
while True:
item = q.get() # 取,空就等
print(item); q.task_done()
threading.Thread(target=worker, daemon=True).start()
q.put("帧") # 满(maxsize)时阻塞
frame_queue = queue.Queue(maxsize=10) 是背压点;满了丢帧就在 put 处。
6. subprocess 调 ffmpeg
subprocess(说人话:在 Python 里启动另一个程序)。你拉流(说人话:把远程视频接进来)/推流都是起 ffmpeg 子进程。
import subprocess
p = subprocess.Popen(["ffmpeg", "-i", "in.mp4", "out.mp4"],
stdout=subprocess.PIPE)
frame = p.stdout.read(...) # 实时读解码后的帧
7. numpy 基础
帧就是 numpy(说人话:Python 里专门处理数字表格的工具)数组。重点:shape(说人话:这张图的尺寸,高×宽×通道数)、view vs copy(视图,说人话:切出来的一块还连着原图,改了会影响原图;复制=另存一份才互不干扰)。
import numpy as np
img = np.zeros((720, 1280, 3), dtype=np.uint8)
print(img.shape) # (720, 1280, 3)
crop = img[0:100, 0:100] # 视图,不是复制
8. 字典 / 枚举 / dataclass
字典(说人话:用「名字→值」成对存东西,像电话本);dataclass(说人话:一种省事的写「数据模板」的写法)。下面代码看一眼就懂。
d = {"conf": 0.5, "imgsz": 640} # 键值对,配置常这么存
from dataclasses import dataclass
@dataclass
class Task:
stream_url: str
conf: float = 0.5
9. 异常处理 try / except
异常(说人话:程序跑挂了的意外状况,我们得提前兜住)。模型加载失败要兜底(你 load_model 就有 try/except 回退 .pt)。
try:
model = load_engine("a.engine")
except Exception as e:
print("engine 失败,回退:", e)
model = load_pt("a.pt")
10. 模块导入
模块导入(说人话:把别人写好的代码文件拿过来用)。import fram_load_dir 就是导入同目录模块;from x import y 只取要用的。
cpu_model_stream.py 里搜对应用法(如搜 queue.Queue、subprocess.Popen、with),读懂那几行,比孤立背语法快 10 倍。