☰
Python虚拟环境全指南:venv与conda选型、Python版本选择及避坑实操
2026/10/27 12:16:40 网站建设 项目流程

1. 为什么每个 Python 开发者都绕不开虚拟环境这道坎

刚接触 Python 那会儿,我最常干的一件事就是pip install一路装到底,所有库全塞进系统 Python 里。结果没过多久就翻车了:项目 A 要numpy 1.19,项目 B 要numpy 1.24,两个需求一撞,系统环境直接乱成一锅粥,删了重装、重装又冲突,来回折腾一整天。后来才明白,这不是我手笨,而是没搞懂 Python 虚拟环境这套机制。

虚拟环境说白了就是给每个项目单独划一块“独立地盘”,每个地盘里有自己的 Python 解释器和自己的第三方库,互不干扰。你在项目 A 里装什么、升级什么,项目 B 完全不受影响。这个思路听起来简单,但它解决的是 Python 生态里最要命的一个问题——依赖隔离。没有隔离,你的开发环境迟早会变成一团解不开的毛线球。

这篇文章我打算把三件事讲透:venv、conda这两套主流虚拟环境方案到底怎么选、怎么用;Python 版本选择背后的门道;以及那些官方文档不会告诉你、但实际开发中天天踩的坑。不管你是刚装完 Python 的新手,还是被 conda 命令折磨过的老手,都能从里面找到能直接抄作业的东西。我会尽量用大白话加实操命令的方式来讲,每个关键选择都告诉你为什么这么选,而不是甩一堆命令让你自己猜。

2. venv 与 conda 的核心差异与选型逻辑

2.1 两者到底解决的是不是同一个问题

很多人一开始会以为 venv 和 conda 是竞品,选一个就行。其实它们的设计目标有重叠,但定位并不完全一样。

venv是 Python 3.3 之后官方自带的标准库模块,它的职责非常纯粹:创建一个隔离的 Python 运行环境,里面只包含 Python 解释器和 pip,第三方包靠 pip 从 PyPI 装。它管的是“Python 包”这一层。

conda则是一个跨语言的包管理和环境管理系统,最早为科学计算场景而生。它不仅能管 Python 包,还能管 Python 解释器本身、C/C++ 编译好的二进制库(比如 BLAS、MKL、CUDA 相关的底层依赖),甚至能管 R、Node 等其他语言的包。它管的是“整个软件栈”这一层。

这个差异直接决定了它们的适用边界。举个最典型的例子:你要装 PyTorch 的 GPU 版本,背后牵扯到 CUDA runtime、cuDNN 这些非 Python 的二进制依赖。用 pip 装,你得自己保证系统里的 CUDA 版本对得上;用 conda 装,它会把这一整套依赖一起给你配好。这就是为什么搞深度学习的人几乎人手一个 conda。

2.2 一张表看清选型依据

我把实际选型时最该看的几个维度整理成表,你对着自己的场景对号入座就行。

对比维度venvconda
是否需额外安装否,Python 自带需单独安装 Miniconda/Anaconda
管理范围仅 Python 包Python 包 + 解释器 + 二进制依赖
环境体积小,几十 MB 起大,动辄几百 MB 到几 GB
切换 Python 版本需系统已装对应版本创建环境时直接指定任意版本
科学计算/GPU 支持一般,需手动处理底层库强,自动解决二进制依赖
创建速度快,秒级慢,首次创建常需几分钟
跨平台一致性好好,但环境文件更重
典型适用场景Web 开发、脚本、轻量项目数据科学、深度学习、多版本并存

2.3 我的实际选型习惯

说下我自己的做法,供你参考。日常写 Flask/FastAPI 后端、写爬虫脚本、做小工具,我一律用 venv,因为它轻、快、不占地方,而且不依赖额外安装的软件。只要项目里不涉及复杂的科学计算底层库,venv 完全够用。

一旦项目涉及 PyTorch、TensorFlow、OpenCV 这类重依赖,或者需要在同一台机器上同时维护 Python 3.8、3.10、3.11 多个版本做兼容测试,我就切到 conda。conda 创建环境时能直接conda create -n xxx python=3.8,不用先去系统里装一个 3.8,这一点对多版本共存太友好了。

提示:不要在同一台机器上既用 conda 又用系统 pip 往 base 环境里乱装东西。base 环境保持干净,只用来管理其他环境,这是无数人踩坑后总结出的铁律。

3. venv 实操:从创建到日常使用的完整流程

3.1 创建与激活的正确姿势

venv 的用法极其简单,但细节上有几个容易忽略的点。标准创建命令是:

python -m venv myenv

这里我强烈建议用python -m venv而不是直接敲venv,因为前者能确保你调用的是当前这个 Python 解释器对应的 venv 模块,避免多版本环境下调错。

创建完成后,环境目录myenv里会有bin(Linux/macOS)或Scripts(Windows)子目录,激活脚本就在里面。

Windows 下激活:

myenv\Scripts\activate

Linux/macOS 下激活:

source myenv/bin/activate

激活成功后,命令行提示符前面会出现(myenv)字样,这就是最直观的“我已经在环境里了”的信号。退出用deactivate即可。

3.2 一个被无数人忽略的细节:别把环境目录提交到 Git

venv 创建的环境目录动辄几十上百 MB,而且里面全是本机路径相关的文件,绝对不能提交到版本库。正确做法是在项目根目录建一个.gitignore,写上:

myenv/ __pycache__/ *.pyc

然后把依赖清单单独导出成requirements.txt:

pip freeze > requirements.txt

别人拿到你的项目后,创建自己的 venv,再pip install -r requirements.txt就能还原出一模一样的依赖。这套流程是 Python 项目协作的标准动作,务必养成习惯。

3.3 指定 Python 版本创建环境

如果你系统里装了多个 Python 版本,想用特定版本建环境,可以这样:

python3.10 -m venv myenv310

Windows 上如果装了多个版本,通常是通过py启动器来指定:

py -3.10 -m venv myenv310

这里有个坑要提醒:venv 只能基于系统里已经存在的 Python 版本来创建,它没法帮你下载一个新版本。所以如果你系统里只有 3.11,想建 3.8 的环境,得先去装一个 3.8。这也是很多人转向 conda 的直接原因。

3.4 实操心得:环境放哪、怎么命名

我见过太多人把 venv 建在项目外面,结果时间一长自己都忘了哪个环境对应哪个项目。我的习惯是环境目录就放在项目根目录下,命名统一用.venv(前面加点,很多编辑器和工具会自动识别并忽略它)。这样打开项目就知道环境在哪,删项目时环境一起删掉,不留垃圾。

另外,VS Code 会自动扫描项目下的.venv并提示你切换解释器,省去手动配置的麻烦。PyCharm 新建项目时也会默认帮你建 venv,选好解释器版本即可。

4. conda 实操:安装、配置与高频命令

4.1 装 Miniconda 还是 Anaconda

这是个经典问题。Anaconda 是“全家桶”,预装了 numpy、pandas、jupyter 等一大堆科学计算包,装完几个 GB;Miniconda 是“精简版”,只带 conda 和 Python,几百 MB,需要什么自己装。

我的建议很明确:装 Miniconda。原因有两个。第一,Anaconda 预装的包版本往往不是你项目需要的,你还得升级或降级,反而添乱;第二,Miniconda 干净,环境可控,出问题时排查范围小。除非你完全不想折腾、只想开箱即用,否则 Miniconda 是更专业的选择。

安装时有个关键选项:是否把 conda 加入 PATH。Windows 安装器会问你这个。我的建议是不要勾选自动加入 PATH,而是让安装器把 conda 初始化到你的 shell 里(安装器会问你要不要 init)。原因后面讲常见问题时细说。

4.2 配置国内镜像加速

conda 默认从国外源拉包,速度经常慢到让人怀疑人生。配置国内镜像能显著提速。以清华源为例,执行:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes

配置完可以用conda config --show channels查看当前生效的源。如果哪天想恢复默认,conda config --remove-key channels即可。

pip 的镜像也顺手配一下,因为 conda 环境里照样会用 pip 装包:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

注意:镜像源不是越多越好,channel 顺序会影响解析结果。一般把 main 放前面,遇到某个包在镜像里找不到时,再临时用-c指定官方源。

4.3 高频 conda 命令速查

conda 命令不算多,但有几个必须刻进肌肉记忆。我整理成表,方便你随时对照。

操作命令
创建环境并指定 Python 版本conda create -n myenv python=3.10
创建环境同时装包conda create -n myenv python=3.10 numpy pandas
激活环境conda activate myenv
退出环境conda deactivate
查看所有环境conda env list
查看当前环境已装包conda list
安装包conda install numpy
删除包conda remove numpy
删除整个环境conda env remove -n myenv
导出环境conda env export > environment.yml
从文件还原环境conda env create -f environment.yml

4.4 环境迁移到其他盘的正确做法

热词里有人问“conda 虚拟环境怎么迁移到 D 盘”,这个问题很典型。conda 环境默认建在安装目录下的envs文件夹里,C 盘空间紧张时确实需要挪。

最稳妥的做法不是手动剪切文件夹(那样路径记录会错乱),而是先配置环境存放路径,再重建环境。步骤如下:

第一步,查看当前环境路径配置:

conda config --show envs_dirs

第二步,添加新的环境目录,比如 D 盘:

conda config --add envs_dirs D:\conda_envs

第三步,以后新建的环境就会优先放到 D 盘。已有的环境如果想迁移,最干净的方式是导出environment.yml,删掉旧环境,再在新路径下重建:

conda env export -n oldenv > environment.yml conda env remove -n oldenv conda env create -f environment.yml

手动剪切文件夹虽然看起来快,但环境里很多脚本写死了绝对路径,剪完大概率激活失败,得不偿失。

5. Python 版本选择:别盲目追新,也别死守旧版

5.1 版本选择的三个判断维度

Python 版本选择不是“越新越好”这么简单,得综合看三件事。

第一,项目依赖的兼容性。很多库对 Python 版本有明确要求。比如某些老牌科学计算库在 3.12 上还没适配,你硬上新版本就是自找麻烦。选版本前先去项目要用的核心库的官方文档或 PyPI 页面看它支持的 Python 范围。

第二,长期支持情况。Python 官方每个版本有固定的维护周期,一般新版本发布后维护 5 年左右。选一个还在维护期内的版本,能持续拿到安全更新。已经停止维护的版本(比如 3.7 及更早)除非有特殊原因,否则不建议新项目使用。

第三,生态工具链的跟进速度。新版本刚发布时,很多第三方工具、IDE 插件、打包工具还没跟上,容易遇到各种莫名其妙的报错。等新版本发布半年到一年、生态稳定后再迁移,是更稳妥的策略。

5.2 当前阶段的实用建议

结合我自己的实践,目前比较稳的选择是3.10 或 3.11。这两个版本生态成熟、库支持全面,绝大多数项目都能跑。3.12 虽然性能有提升,但部分库的适配还在完善中,如果不是特别需要新特性,可以再观望一阵。

对于必须维护老项目的场景,3.8 依然有大量存量代码在用,但新项目就别从 3.8 起步了,除非你的部署环境被锁死。

提示:用 conda 的最大好处之一,就是能在同一台机器上同时保留 3.8、3.10、3.11 多个环境,按项目切换,互不影响。这是 venv 做不到的(venv 依赖系统已装版本)。

5.3 版本与虚拟环境的组合策略

我的组合策略是这样的:系统层面只装一个较新的 Python(比如 3.11)用于日常脚本和 venv 项目;conda 层面按项目需要创建不同版本的环境。这样既保证了日常开发的轻便,又保留了多版本兼容测试的能力。

具体来说,一个 Web 后端项目用 venv + 系统 3.11;一个需要 3.8 的老数据处理项目用 conda 建 3.8 环境;一个深度学习项目用 conda 建 3.10 环境并装好 CUDA 相关依赖。三套环境各管各的,切换靠conda activate和deactivate,清清爽爽。

6. 常见问题与排查技巧实录

6.1 conda 命令报“无法识别”怎么办

这是热词里出现频率最高的问题之一,典型报错是:

conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

或者:

condaerror: run 'conda init' before 'conda activate'

这两个报错的根源是一样的:conda 没有被正确初始化到当前 shell。

第一个报错说明 conda 的可执行文件路径没进 PATH,或者你装的时候没勾选加入 PATH。解决办法是找到 conda 安装目录下的Scripts和condabin文件夹,手动加到系统环境变量 PATH 里,然后重开终端。

第二个报错更常见,通常出现在 PowerShell 里。它提示你要先运行conda init。执行:

conda init powershell

然后关闭并重新打开终端(这一步很多人漏掉,不重开不生效)。重开后如果 PowerShell 提示执行策略限制,可能需要用管理员权限运行一次:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

6.2 激活环境后 pip 装到了错误的地方

有时候你明明激活了 conda 环境,pip install却装到了系统 Python 里。这通常是因为环境里没有 pip,或者 pip 指向了系统解释器。

排查方法:激活环境后执行which pip(Linux/macOS)或where pip(Windows),看输出的路径是不是在当前环境目录下。如果不是,说明 pip 没绑对。

解决办法是在环境里重装 pip:

conda install pip

或者直接用python -m pip install xxx的方式,强制用当前环境的解释器来调 pip,这样最保险。

6.3 环境创建到一半失败或卡住

conda 创建环境时卡在 “Solving environment” 是家常便饭,尤其是依赖复杂的时候。几个应对思路:

  • 换用mamba,它是 conda 的加速替代品,解析依赖快很多,命令基本兼容,把conda换成mamba即可。
  • 减少一次性安装的包数量,分批装。
  • 指定更宽松的版本约束,别把版本号卡太死。
  • 检查镜像源是否可用,必要时临时切回官方源。

6.4 常见问题速查表

现象可能原因解决方向
conda 命令无法识别未初始化或未加 PATH运行 conda init 并重开终端
activate 报 init 错误shell 未初始化conda init 对应 shell
pip 装错位置pip 未绑定当前环境用 python -m pip
创建环境卡住依赖解析慢换 mamba 或减少包数量
环境迁移后激活失败绝对路径失效导出 yml 后重建
包版本冲突依赖不兼容新建干净环境重装

6.5 几个我踩过的坑

第一个坑:在 base 环境里装了一堆项目包。刚开始图省事,所有包都往 base 里塞,结果 base 越来越臃肿,后来想清理都不知道哪些能删。正确做法是 base 只留 conda 本身,项目一律新建环境。

第二个坑:混用 conda install 和 pip install 装同一个包。这会导致包管理记录混乱,conda 不知道 pip 装了什么,升级时容易出问题。原则是:能用 conda 装的优先用 conda,conda 里没有的再用 pip,并且尽量在环境创建初期就把 pip 包装完。

第三个坑:环境名起得太随意。test、env1、new这种名字,过两周你自己都不知道是干嘛的。建议用“项目名+用途”的方式命名,比如webapi-py311、dl-torch,一眼就知道对应哪个项目。

7. 工具链协同:编辑器与虚拟环境的对接

7.1 VS Code 里配置 conda 环境

VS Code 对 conda 的支持很成熟。打开项目后按Ctrl+Shift+P,输入 “Python: Select Interpreter”,列表里会列出所有 conda 环境,选你要的那个即可。选完后,VS Code 的终端会自动激活对应环境,运行和调试都用这个解释器。

如果列表里没显示你的环境,检查一下 conda 是否已初始化,或者手动填解释器路径(在环境目录下的python.exe)。

7.2 PyCharm 里配置虚拟环境

PyCharm 新建项目时可以直接选 “New environment”,支持 venv、conda、pipenv 等多种类型。已有项目可以在 Settings 里的 Project Interpreter 处添加。添加 conda 环境时,指向环境目录下的 python 可执行文件即可。

一个实用技巧:PyCharm 的终端默认会激活项目配置的解释器环境,所以你不用手动 activate 就能直接 pip install,省事不少。

7.3 环境与依赖清单的版本管理

无论用 venv 还是 conda,都建议把依赖清单纳入版本控制。venv 用requirements.txt,conda 用environment.yml。前者只记录 pip 包,后者记录得更全(包括 Python 版本和 channel 信息)。

一个容易忽略的点:pip freeze会把所有间接依赖也导出,清单会很长但更精确;而手写requirements.txt只列直接依赖,更简洁但可能因间接依赖版本漂移导致环境不一致。生产项目建议用pip freeze的完整清单,或者用pip-tools这类工具管理。

8. 写在最后的一点个人体会

折腾虚拟环境这些年,我最大的感受是:环境隔离不是可选项,而是必修课。早期偷懒省下的那点时间,后期都会以“依赖冲突排查一整天”的形式加倍还回来。venv 和 conda 没有绝对的高下,只有适不适合你的场景。轻量项目用 venv,重依赖和多版本场景用 conda,这个判断标准我用了很久,基本没出过错。

另外分享一个小习惯:每建一个新环境,我第一件事就是先pip config或conda config把镜像配好,再装包。这个动作花不了一分钟,但能省下大量等待下载的时间。环境建好后立刻导出一次依赖清单作为基线,后续每次装新包都重新导出,这样环境状态始终有据可查,换机器或协作时直接还原,几乎不会出岔子。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询