envsetup和python venv

news/2025/3/10 11:19:16/

了解!虽然你已熟悉基本用法,但我们可以更聚焦场景和实际意义,结合嵌入式开发中可能的用例来深入探讨 venv 的作用。


Python venv 的核心本质

venv(虚拟环境)的核心是隔离性,它通过创建独立的 Python 运行环境,解决以下问题:

  1. 依赖冲突:不同项目可能需要同一库的不同版本(如 numpy 1.19 vs numpy 1.21)。
  2. 系统环境干净性:避免因安装全局 Python 包污染系统环境,导致系统工具崩溃(如 Linux 的包管理器 apt 依赖特定 Python 版本)。
  3. 可移植性:通过 requirements.txt 记录依赖,轻松复现环境。

嵌入式开发中的典型使用场景

场景 1:不同项目依赖隔离

假设你有两个嵌入式相关项目:

  • 项目 A:使用 pyserial 3.5 与设备通信。
  • 项目 B:需要 pyserial 4.0 + pytest 做自动化测试。

直接全局安装会导致版本冲突,用 venv 隔离:

# 为项目 A 创建虚拟环境
python -m venv ~/venvs/project_a
source ~/venvs/project_a/bin/activate
pip install pyserial==3.5# 为项目 B 创建虚拟环境
python -m venv ~/venvs/project_b
source ~/venvs/project_b/bin/activate
pip install pyserial==4.0 pytest
场景 2:保护系统 Python 环境

在 Linux 系统中,许多系统工具(如 aptansible)依赖系统自带的 Python。若全局安装第三方库(如 requests)可能导致依赖冲突,甚至破坏系统工具。通过 venv 隔离:

# 为自定义脚本创建独立环境
python -m venv ~/venvs/my_script
source ~/venvs/my_script/bin/activate
pip install requests  # 不影响系统 Python
场景 3:团队协作与 CI/CD

假设你编写了一个嵌入式设备日志分析工具(Python 脚本),需分享给团队:

  1. 在虚拟环境中安装依赖并生成 requirements.txt
    python -m venv log_analyzer_venv
    source log_analyzer_venv/bin/activate
    pip install pandas matplotlib  # 安装所需库
    pip freeze > requirements.txt  # 生成依赖清单
    
  2. 将脚本和 requirements.txt 提交到 Git。其他成员克隆后,一键复现环境:
    python -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
    
场景 4:测试不同 Python 版本

若你的工具需要兼容 Python 3.8 和 3.10,可通过 venv 快速切换(需系统已安装多版本 Python):

# 使用 Python 3.8 创建环境
python3.8 -m venv py38_env
source py38_env/bin/activate
python --version  # 输出 3.8.x# 使用 Python 3.10 创建环境
python3.10 -m venv py310_env
source py310_env/bin/activate
python --version  # 输出 3.10.x

venv 的优势 vs 替代方案

工具优势适用场景
venv轻量、Python 内置、无需额外安装大多数 Python 项目隔离
virtualenv更灵活(支持旧版 Python)需要兼容 Python 2.x 的项目
conda可管理非 Python 依赖(如 C 库)科学计算、复杂依赖项目
Docker完全隔离的系统环境需要完整环境复现的部署场景

何时应该使用 venv?

  1. 开发 Python 应用/脚本:即使是一个小工具,也建议隔离环境。
  2. 多人协作:确保所有人的依赖版本一致。
  3. 使用 pip 安装库:避免污染全局环境。
  4. 测试不同依赖组合:快速验证版本兼容性。

嵌入式开发中的实际联动案例

假设你正在开发一个基于 Android 的嵌入式设备调试工具链

  1. envsetup 编译 Android 系统镜像。
  2. venv 创建一个 Python 环境,运行自定义脚本:
    • 通过 adb 与设备通信。
    • 使用 pandas 分析设备日志。
    • matplotlib 生成性能报告。

此时,venv 确保脚本依赖的库(如 adb 的 Python 封装库)不会影响 Android 编译环境或其他系统工具。


作为嵌入式软件工程师,你可能在开发中需要同时接触系统级编译环境和脚本工具开发。以下是 Android envsetupPython venv 的详细对比和示例说明:


1. Android envsetup

作用:Android 源码开发中的环境配置工具
场景:用于配置 Android 源码编译环境,提供快捷命令和开发工具链
核心功能

  • 定义编译环境变量(如 ANDROID_BUILD_TOP
  • 提供快捷命令(如 lunch, mm, mmp
  • 集成 Android 编译工具链(如 make, soong
示例步骤:
# 进入 Android 源码目录
cd ~/aosp# 加载环境配置脚本(核心操作)
source build/envsetup.sh# 选择目标设备(例如 Pixel 6 的编译配置)
lunch aosp_oriole-userdebug# 编译单个模块(例如编译 Settings 模块)
mm -j8# 编译整个系统
make -j8

关键点

  • envsetup.sh 是 Android 源码编译的入口脚本,所有编译操作前必须执行。
  • lunch 命令会设置 TARGET_PRODUCT 等环境变量,决定编译目标设备的固件。
  • mm 是编译当前目录模块的快捷命令(依赖 Android.mkAndroid.bp)。

2. Python venv

作用:Python 虚拟环境管理工具
场景:隔离不同 Python 项目的依赖环境,避免全局包污染
核心功能

  • 创建独立的 Python 解释器副本
  • 隔离 pip 安装的第三方库
  • 通过激活脚本(activate)切换环境
示例步骤:
# 创建虚拟环境(默认使用当前 Python 版本)
python -m venv myenv# 激活虚拟环境(不同系统命令不同)
# Linux/macOS
source myenv/bin/activate
# Windows
myenv\Scripts\activate.bat# 在虚拟环境中安装依赖
pip install requests==2.28.0# 运行 Python 脚本(使用虚拟环境中的库)
python my_script.py# 退出虚拟环境
deactivate

关键点

  • venv 是 Python 3.3+ 内置工具,无需额外安装。
  • 虚拟环境中的 pip 安装的包会存储在 myenv/lib/python3.x/site-packages 目录。
  • 适合管理不同项目的依赖冲突(例如一个项目用 TensorFlow 1.x,另一个用 TensorFlow 2.x)。

对比总结

特性Android envsetupPython venv
用途Android 源码编译环境配置Python 项目依赖隔离
作用对象全局编译环境(整个源码树)单个 Python 项目
核心命令source build/envsetup.sh, lunch, mmpython -m venv, activate
依赖管理通过 Android.mk/Android.bp 文件通过 requirements.txtpipenv
典型场景编译 AOSP 系统镜像或模块开发独立 Python 应用或脚本

嵌入式开发中的联动场景

假设你在开发 Android 系统的嵌入式设备时,可能会同时用到两者:

  1. envsetup 编译 Android 系统镜像(如 aosp_car_x86_64-userdebug)。
  2. venv 创建一个 Python 环境,运行自动化测试脚本(如通过 ADB 控制设备)。
    此时两者分工明确,互不干扰:envsetup 管理编译环境,venv 管理 Python 脚本依赖。

http://www.ppmy.cn/news/1578060.html

相关文章

国科大——数据挖掘(0812课程)——考试真题

前沿: 此文章记录了国科大数据挖掘(0812)课程的考试真题。 注: 考试可以携带计算器,毕竟某些题需要计算log,比如:决策树等。 2016年 1. Suppose a hospital tested the age and body fat for …

降级选型啊

推荐替代方案 Resilience4j(首选) 轻量级容错库(约20KB核心依赖) 核心优势: 100%纯Java实现,无额外运行时开销 支持CircuitBreaker/Bulkhead/Retry/TimeLimiter等注解 完美适配Spring Boot 2.1&#xff08…

React:类组件(上)

kerwin老师我来了 类组件的创建 class组件&#xff0c;js里的类命名首字符大写&#xff0c;类里面包括构造函数&#xff0c;方法 组件类要继承React.Component才有效 必须包含render方法 import React from react class App extends React.Component{render() {return <…

MySQL|MySQL 中 `DATE_FORMAT()` 函数的使用

文章目录 概述方法签名格式化字符基本用法实际应用案例 示例1&#xff1a;显示日期和星期几示例2&#xff1a;仅显示日期示例3&#xff1a;按周统计订单数量 注意事项结论 概述 DATE_FORMAT() 是 MySQL 中的一个内置函数&#xff0c;用于格式化日期和时间数据。它可以根据…

阿里云操作系统控制台——解决服务器磁盘I/O故障

目录 引言 需求介绍 操作系统使用实例 获得的帮助与提升 建议 引言 你的云服务器是否遇到过系统响应变慢、服务超时&#xff0c;或者进程卡顿、磁盘空间不足、系统日志频繁告警的问题&#xff1f;这些情况在日常运维中并不少见&#xff0c;尤其是在 高负载或资源紧张时&a…

交大智邦后端Java笔试题

交大智邦后端Java笔试题 简答题 只要一个类加上了Component注解&#xff0c;就一定能成为一个Spring Bean吗&#xff1f;如果不是&#xff0c;请举出反例。 不一定 扫描范围不包括 com.code.lab.web.component 或者被 ComponentScan 显式排除 通过 excludeFilters 手动排除特定…

css实现元素垂直居中显示的7种方式

文章目录 * [【一】知道居中元素的宽高](https://blog.csdn.net/weixin_41305441/article/details/89886846#_1) [absolute 负margin](https://blog.csdn.net/weixin_41305441/article/details/89886846#absolute__margin_2) [absolute margin auto](https://blog.csdn.net…

EPS8266远端固定UDP传输

UDP通信 先回顾一下TCP与CDP的区别 UDP传输不区分server或者client&#xff0c;由指令ATCIPSTART建立传输。 UDP传输分为固定远端的UDP通信和远端可变的UDP通信 1.配置WiFi模式 ATCWMODE3 响应&#xff1a;ok 2连接路由器 ATCWJAP“SSID”&#xff0c;“password” 响应…