MediaPipe 跑通 Python 3.7:改三个文件就能用
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
公司一台旧机器还停在 Python 3.7,你要把现成的手部跟踪流水线迁到 MediaPipe 上。pip install一路报错,整个环境又没法升级。这个例子讲清楚:怎么改三处文件,让 MediaPipe 手部检测在 3.7 下直接跑通。
🔍 先花2分钟确认你是不是这个问题
MediaPipe 安装报错解决这类问题,症状一般就三种,对号入座:
- 安装阶段依赖冲突:
ERROR: Could not find a version that satisfies the requirement protobuf>=4.25.3,<5 (from mediapipe) ERROR: No matching distribution found for protobuf>=4.25.3,<5protobuf 4.x 的 wheel 不提供 3.7 的构建,pip 自然找不到可用版本。
- 运行阶段语法报错:
File "mediapipe/python/solution_base.py", line 123 SyntaxError: invalid syntax代码里出现了 3.8+ 才支持的写法,3.7 解释器根本不认识。
- 导入阶段失败:
ImportError: cannot import name 'Packet' from 'mediapipe.python.packet'多是 protobuf 绑定装不上导致的连带问题,根子还是在第 1 条。
🔧 改这三处就够了
本质原因一句话:MediaPipe 官方版本矩阵(3.9~3.12)和你的 3.7 解释器错位了,新版依赖相当于新钥匙配旧锁孔,拧不动。改法集中在三个文件,改动都发生在你本地克隆的工作区里,别提交回上游仓库。
1) requirements.txt 钉死版本号
文件在仓库根目录的requirements.txt。当前内容是absl-py~=2.3、flatbuffers~=25.9、未锁numpy,也没显式写 protobuf(它是传递依赖被拉进来的)。建议改成:
absl-py==0.15.0 certifi numpy<2 protobuf==3.20.1 flatbuffers>=2.0 opencv-contrib-python matplotlib改这里是为了把三个没有 3.7 构建的依赖压回兼容区间。protobuf 是关键:3.20.1 是 3.x 系列里最后一个支持 3.7 的版本,再往低了降,仓库里 pb2 生成的代码可能缺 API。numpy 加<2是因为 numpy 2.x 只有 3.9+ 的 wheel。
2) setup.py 补版本声明
打开 setup.py,在classifiers列表里加一行,并补上python_requires:
# 改动前(仓库现状) 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', # 改动后 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10',python_requires='>=3.7',改这里是为了让元数据和你的实际解释器一致。classifiers 本身不拦安装,真正的卡点是上一条的依赖解析,这里只是别让工具链误判。
3) solution_base.py 换掉新语法
如果报 SyntaxError,元凶通常是海象运算符。替换套路是"先赋值,再判断":
# 改动前(3.8+ 写法) if (result := self._process_image(image)) is None: return None # 改动后(等价逻辑,3.7 可解析) result = self._process_image(image) if result is None: return None我在mediapipe/python/下用正则查过:=,当前版本的 mediapipe/python/solution_base.py 没有命中;你拿到的版本若有报错,照这个模式逐一替换即可。
✅ 跟着做一遍,3分钟跑通
先克隆并安装:
git clone https://gitcode.com/GitHub_Trending/med/mediapipe cd mediapipe pip install -r requirements.txt pip install .再建一个最小脚本test_hand.py:
import cv2 import mediapipe as mp hands = mp.solutions.hands.Hands() img = cv2.imread('mediapipe/examples/coral/images/object_detection_demo_coral.jpg') res = hands.process(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) print('hand found:', bool(res.multi_hand_landmarks)) hands.close()看到hand found: True,说明 Python 3.7 兼容改完就通了。提醒一句:源码安装依赖 bazel,setup.py里会做版本检查,首次编译偏慢属正常现象。
⚠️ 少走弯路的几个点
- 别把 protobuf 降过头。3.20.1 是下限,再低 pb2 文件容易缺 API 直接 ImportError。
- 打算留在生产环境的话,记得定期查 protobuf 3.20.x 与 absl-py 0.15.0 的 CVE 公告,旧版本不再收安全更新。
mp.solutions.*属于旧版 Solutions 线,和新的 Tasks 线依赖要求不同,混用时注意分开两个虚拟环境。- 只是想快速验证能力的话,可以先装当年 3.7 时代的预编译 wheel 跑业务,确有定制需求再回到这套源码改法。
长期看,把环境挪到 3.9 或 3.10 更省心,本文所有钉版本操作都能原样去掉。安装细节和排错入口见仓库内文档 docs/getting_started/python.md。
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考