python虚拟环境总结(python -m venv和anaconda,miniconda的异同)

下面把 python -m venv(简称 venv)和 Anaconda/Miniconda(conda) 放在同一张“脑内对照表”里讲清楚:它们都能“隔离环境”,但定位和能力边界不一样。


共同点(相同)

  • 都能创建相互隔离的 Python 环境(不同项目互不干扰)
  • 都支持为每个项目安装不同版本的依赖
  • 都能做到“这个项目用这一套包/解释器”

核心差异(最重要的不同)

1) 解决的问题范围

1.1 安装范围
venv:只管 Python 生态(pip 包)

  • 主要隔离的是:pip install … 装的 Python 包
  • 不擅长处理:系统级/二进制依赖(如 CUDA、MKL、GDAL、某些 C 库)

conda:管 Python + 非 Python 依赖(更像“环境管理器”)

  • 不仅能装 Python 包,也能装很多非 Python 的库和工具链
  • 常见优势场景:数据科学/深度学习/科学计算(numpy/scipy/pytorch + CUDA 等)

1.2 作用范围
venv:通常一个项目一个venv

  • 环境通常是“项目本地的一个目录”(比如 ./myvenv),所以激活脚本路径是相对项目的——你不在项目目录就找不到 ./myvenv/bin/activate。

conda:本机多个项目共享一个或几个env

  • 环境默认集中放在一个全局目录(比如 ~/miniconda3/envs/xxx),激活时 conda 自己去那个全局目录找,所以你在任何目录都能 conda activate xxx。

2) Python 版本管理

venv:用“当前 python”创建环境

  • 你先得装好目标版本的 Python,然后用那个 Python 来创建 venv
    例如你想要 3.11,你得先有 python3.11

conda:创建环境时直接指定 Python 版本

  • conda create -n myenv python=3.11
    conda 会自己下载安装到环境里(更省事)

3) 包管理器与依赖解析

venv:环境隔离 + pip 装包

  • 默认用 pip(依赖解析能力较强,但遇到编译/二进制问题时可能麻烦)
  • 依赖冲突时通常靠你调整版本、换轮子、装系统依赖

conda:用 conda(或 mamba)装包

  • conda 走“预编译二进制包 + 环境级依赖解析”
  • 很多 C/系统依赖它会一并解决(更“省心”)
  • 缺点是:不同 channel(defaults/conda-forge)混用时要更小心

4) 体积与侵入性

venv:轻量、几乎零侵入

  • 标准库自带(Python 3.3+)
  • 创建快、环境小,适合工程/后端/脚本项目

Anaconda:很重

  • 自带大量科学计算包(动辄几个 GB)
  • 适合“一装就能干活”的数据科学新手或离线场景

Miniconda:轻很多

  • 只带 conda + 最基础组件,按需安装包
  • 工程上更常用(比 Anaconda 更干净)

“怎么选”最实用的建议

优先用 venv 的情况(工程常见)

  • Web/后端/脚本/一般应用开发
  • 依赖基本都是纯 Python 或常见 wheel(不会动不动编译)
  • 你希望环境尽量轻、尽量贴近 PyPI 生态
  • 团队使用 requirements.txt / pip-tools / poetry 等
    ✅ 典型:FastAPI/Django、爬虫、CLI 工具、内部服务

优先用 conda 的情况(数据科学/科研常见)

  • 你经常需要:numpy/scipy、pytorch/tensorflow、CUDA、GDAL、opencv 等
  • 经常踩到 “pip 装不上/编译失败/缺系统库”
  • 需要快速切 Python 版本 + 需要稳定的二进制依赖
    ✅ 典型:机器学习训练环境、Jupyter、地理信息/科学计算

最容易踩的坑(提醒)

1.不要在同一个环境里混着 conda 和 pip 乱装

  • 可以混,但要有原则:
    • 优先 conda install 能装的
    • conda 没有再 pip install
  • 否则容易依赖冲突或“环境漂移”

2.venv 不等于“能装所有东西”

  • 如果包需要系统依赖(编译工具链、C 库),venv 不会帮你装这些

常用命令对照

venv

cd xxx/xxx/myproject python -m venv .venv ## 安装项目依赖 pip install -r requirements.txt ## 后续使用时cd xxx/xxx/myproject source .venv/bin/activate ## 退出环境 deactivate 

conda(Miniconda/Anaconda 都一样)

conda create -n myenv python=3.11 conda activate myenv conda install numpy pandas ## 退出环境### conda deactivate

补充实战中遇到的问题

创建的虚拟环境是否存放在自定义目录下管理

venv

  • 单项目 / 希望可复制可迁移:放项目里 ./myvenv(团队协作最常见)
  • 本机多个项目共享/集中管理:放 xxx/xxx/myvenvs/xxx_envname(更像 conda)(目前还未尝试)

conda

  • 按名字建环境(推荐:全局统一管理)
conda create -n myenv python=3.7## 环境会放到 conda 的 默认 envs 目录(由 conda 配置决定;常见是 ## <conda安装目录>/envs 或 ~/.conda/envs)。## 你可以用 ## conda env list / conda info --envs 直接看到实际路径## 激活环境 conda activate myenv ## 直接使用名称即可
  • 按路径建环境(推荐:自定义管理虚拟环境的目录)
conda create -p xxx/xxx/xxx/xxx/myenv python=3.7## 环境就在你指定的那个目录## 激活环境 conda activate xxx/xxx/xxx/xxx/myenv ## 通常需要用“路径”激活
  • 想“自定义目录管理”但还想“只用名字激活”,怎么办?
    统一放到一个自定义 envs 总目录,并把这个目录加入 conda 的 envs_dirs(这样它就能按名字找到了)。之后你把环境建在这个目录下面,例如:
## 目前还未尝试 conda config --add envs_dirs /data/conda_envs conda create -n myenv python=3.7

Read more

基于C++11手撸前端Promise

基于C++11手撸前端Promise

文章导航 * 引言 * 前端Promise的应用与优势 * 常见应用场景 * 并发请求 * Promise 解决的问题 * 手写 C++ Promise 实现 * 类结构与成员变量 * 构造函数 * resolve 方法 * reject 方法 * then 方法 * onCatch 方法 * 链式调用 * 使用示例 * `std::promise` 与 `CProimse` 对比 * 1. 基础功能对比 * 2. 实现细节对比 * (1) 状态管理 * (2) 回调注册与执行 * (3) 异步支持 * (4) 链式调用 * 3. 代码示例对比 * (1) `CProimse` 示例 * (2) `std::promise` 示例 * 4.

By Ne0inhk
HDFS NameNode高可用(HA)完全指南:原理、组件与实现

HDFS NameNode高可用(HA)完全指南:原理、组件与实现

HDFS NameNode高可用(HA)完全指南:原理、组件与实现 * 引言 * 一、NameNode HA架构总览 * 1.1 架构目标 * 1.2 架构图 * 1.3 核心设计思想 * 二、核心组件详解 * 2.1 组件一览表 * 2.2 JournalNode:共享存储的核心 * 工作原理 * 2.3 ZooKeeper:分布式协调者 * 2.4 ZKFC:故障转移控制器 * 2.5 DataNode的特殊角色 * 三、元数据同步机制:QJM详解 * 3.1 QJM是什么? * 3.2 写入流程 * 3.

By Ne0inhk
LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串

LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串

目录 1. 长度最小的子数组 1.1 题目解析 1.2 解法 1.3 代码实现 2. 无重复字符的最长子串 2.1 题目解析 2.2 解法 2.3 代码实现 1. 长度最小的子数组 209. 长度最小的子数组 - 力扣(LeetCode) 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入:

By Ne0inhk
《算法题讲解指南:优选算法-前缀和》--31.连续数组,32.矩阵区域和

《算法题讲解指南:优选算法-前缀和》--31.连续数组,32.矩阵区域和

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 31. 连续数组 题目链接: 题目描述: 题目示例: 解法(前缀和+哈希表): 算法思路: C++算法代码: 算法总结及流程解析: 32. 矩阵区域和 题目链接: 题目描述: 题目示例: 解法: 算法思路: C++算法代码: 算法总结及流程解析: 结束语 31. 连续数组 题目链接: 525. 连续数组 - 力扣(LeetCode) 题目描述: 题目示例: 解法(

By Ne0inhk