第4章 Python虚拟环境:使用venv创建隔离的Python环境
做嵌入式开发这么多年,我踩过最深的坑之一,就是Python包版本冲突。你想想看,项目A需要requests 2.25,项目B非要2.26,一升级整个环境就崩了。嗯,这问题在Zephyr开发中尤其常见——因为Zephyr的构建系统west和它的依赖包,对版本要求非常严格。
所以这一章,我们来聊聊Python虚拟环境。说白了,就是给你的每个项目一个独立的Python“小房间”,互不干扰。
4.1 为什么需要虚拟环境?
先说说我在项目中遇到过的真实案例。有一次,我同时维护两个Zephyr项目,一个基于v2.7,另一个基于v3.0。两个版本的west工具依赖的pykwalify版本不同。如果共用系统Python环境,升级一个就得降级另一个,简直让人抓狂。
虚拟环境解决的就是这个问题。它让你可以为每个项目创建独立的Python解释器和包目录。项目A装什么包,完全不影响项目B。
核心概念:虚拟环境本质上是Python解释器的一个“副本”。它有自己的site-packages目录,安装的包只在这个环境里生效。
4.2 venv vs virtualenv vs conda
Python生态里,虚拟环境工具有好几个。我个人的选择很简单:
| 工具 | 适用场景 | 我的建议 |
|---|---|---|
| venv | Python 3.3+ 内置,轻量级 | Zephyr开发首选,够用 |
| virtualenv | 兼容Python 2,功能更丰富 | 除非你还在用Python 2,否则不推荐 |
| conda | 数据科学、跨语言依赖管理 | 太重了,嵌入式开发没必要 |
对于Zephyr开发,venv完全够用。它轻量、内置、不需要额外安装。我所有Zephyr项目都用venv,从来没出过问题。
4.3 创建你的第一个虚拟环境
操作其实很简单。打开终端,进入你的项目目录,然后执行:
python3 -m venv .venv
这条命令会在当前目录下创建一个叫.venv的文件夹。里面包含了Python解释器、标准库和一个干净的site-packages目录。
小技巧:我习惯把虚拟环境命名为.venv,因为以点开头的文件夹在Linux/macOS下默认隐藏,不会污染项目目录。当然,你也可以叫venv或env,看个人喜好。
创建完成后,需要激活它:
# Linux/macOS
source .venv/bin/activate
# Windows (CMD)
.venv\Scripts\activate.bat
# Windows (PowerShell)
.venv\Scripts\Activate.ps1
激活后,你会看到终端提示符前面多了(.venv)字样。这说明你现在就在虚拟环境里了。
4.4 在虚拟环境中安装Zephyr依赖
激活虚拟环境后,安装包就和平时一样:
pip install west
pip install -r zephyr/scripts/requirements.txt
所有包都会被安装到.venv/lib/python3.x/site-packages里,完全不影响系统Python环境。
注意:每次打开新终端窗口,都需要重新激活虚拟环境。我经常忘记这步,然后发现west命令找不到——嗯,别问我怎么知道的。
4.5 管理多个虚拟环境
如果你像我一样,同时维护多个Zephyr项目,每个项目都有自己的虚拟环境。我的做法是:
- 每个项目根目录下放一个
.venv文件夹 - 在项目根目录创建
requirements.txt,记录所有依赖 - 用
pip freeze > requirements.txt导出当前环境
这样,换到新机器时,只需要:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
环境就完全恢复了。我曾经在换电脑时靠这个流程,半小时就把三个Zephyr项目环境全部搭好,省了不少时间。
4.6 退出和删除虚拟环境
退出虚拟环境很简单:
deactivate
删除就更简单了——直接删掉.venv文件夹:
rm -rf .venv # Linux/macOS
rmdir /s .venv # Windows
因为虚拟环境只是文件系统上的一个目录,删掉就彻底没了。系统Python环境毫发无损。
4.7 常见问题与避坑指南
我曾经遇到过几个坑,分享出来帮你避开:
- 问题1:激活后pip还是系统版本。检查一下是不是PATH没设置对,或者用了
sudo pip install。记住,在虚拟环境里永远不要用sudo。 - 问题2:虚拟环境位置变了。如果你移动了项目目录,虚拟环境会失效。解决办法是删掉重建,或者用
--relocatable参数(但我不推荐,重建更快)。 - 问题3:Git提交了.venv。记得在
.gitignore里加上.venv/。虚拟环境是开发环境,不是项目代码。
最佳实践总结:
- 每个Zephyr项目使用独立的虚拟环境
- 虚拟环境命名为
.venv,并加入.gitignore - 用
requirements.txt记录依赖,方便重建 - 激活环境后再执行west命令
- 不要用sudo,不要移动虚拟环境目录
好了,这一章就到这里。虚拟环境虽然是个小工具,但用好了能省去很多麻烦。下一章我们会聊聊Zephyr SDK的安装,那才是真正开始搭建开发环境的重头戏。