Python 基础补强(面向「读视觉/Agent 代码」)

用大白话说:这一页帮你搞懂——读你那套视频检测代码、自己写 agent(说人话:能自己想办法、调用工具干活的小助手程序)时,最常用到的 10 个 Python 知识点。

你自述 Python 基础不牢。这一页不教通用语法,只列读你代码、写 agent 必会的 10 个点,每个都标了在你项目里的位置。边读代码边对照学最快。

1. 函数与类

函数(说人话:一段能重复使用的「动作」指令)。类(说人话:把「数据」和「动作」打包在一起的模板,像做狗的模板)。你代码里的 process_streamLMBatchProcessor 都是类或函数。

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 只取要用的。

练习:你每天挑 1 个点,去 cpu_model_stream.py 里搜对应用法(如搜 queue.Queuesubprocess.Popenwith),读懂那几行,比孤立背语法快 10 倍。