第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下默认隐藏,不会污染项目目录。当然,你也可以叫venvenv,看个人喜好。

创建完成后,需要激活它:

# 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/。虚拟环境是开发环境,不是项目代码。

最佳实践总结:

  1. 每个Zephyr项目使用独立的虚拟环境
  2. 虚拟环境命名为.venv,并加入.gitignore
  3. requirements.txt记录依赖,方便重建
  4. 激活环境后再执行west命令
  5. 不要用sudo,不要移动虚拟环境目录

好了,这一章就到这里。虚拟环境虽然是个小工具,但用好了能省去很多麻烦。下一章我们会聊聊Zephyr SDK的安装,那才是真正开始搭建开发环境的重头戏。