资讯动态

Python虚拟环境管理:venv与conda选型、实操与避坑指南

发布时间:2026/10/27 12:16:25 来源:尧图企业网站定制
1. 为什么你的Python项目需要一个虚拟环境刚接触Python那会儿我最常干的一件事就是装了一个库跑通了A项目结果B项目跑不起来了。排查半天发现A项目依赖的是numpy 1.19而B项目需要numpy 1.24两个版本在同一个全局环境里打架最后谁也用不了。这种“依赖地狱”几乎是每个Python开发者都会踩的坑而虚拟环境就是解决这个问题最直接的手段。虚拟环境说白了就是给每个项目单独划一块地盘项目里装什么库、用什么版本都只在这块地盘里生效不会污染全局的Python环境也不会影响其他项目。你可以把它想象成每个项目都有自己的工具箱锤子扳手各一套互不借用谁也别想弄乱别人的工具。这篇文章我会把venv、conda这两套主流方案从头到尾讲清楚包括它们各自的适用场景、创建和管理的具体命令、Python版本怎么选、环境迁移怎么做、常见报错怎么排查。不管你是刚装完Python的新手还是被环境问题折腾过的老手都能从这里找到可以直接抄作业的操作步骤。2. venv与conda的核心差异与选型逻辑2.1 两者到底解决的是什么问题venv是Python标准库自带的模块从Python 3.3开始就内置了不需要额外安装任何东西。它的定位非常纯粹创建一个隔离的Python运行环境里面只有Python解释器和pip你需要什么库就自己往里装。它管的是Python包层面的隔离不负责Python解释器本身的版本管理。conda则是一个跨语言的包管理和环境管理系统最初是为科学计算社区设计的。它不仅能管理Python包还能管理Python解释器版本本身甚至能管理非Python的依赖比如某些C库、编译器工具链。这意味着你可以用conda在同一个机器上同时拥有Python 3.8、3.10、3.12三个不同版本的环境切换起来只需要一行命令。两者的核心差异可以用一句话概括venv管包不管解释器conda既管包也管解释器。2.2 选型时我实际考虑的几个维度很多人纠结到底用哪个我的经验是按下面几个维度来判断维度venvconda安装成本Python自带零成本需要单独安装Anaconda或Miniconda解释器版本管理不支持依赖系统已装的Python支持可自由创建不同Python版本包管理范围仅PyPI上的Python包PyPI包 conda频道包 非Python依赖环境体积较小通常几十MB较大基础环境可能几百MB到1GB科学计算库支持依赖pip部分库需要编译预编译二进制安装快且稳定跨平台一致性好更好尤其在Windows上团队协作requirements.txtenvironment.yml如果你做的是Web开发、脚本工具、自动化运维这类偏轻量的项目venv完全够用而且不引入额外依赖干净利落。如果你做的是深度学习、数据分析、科学计算或者需要在同一台机器上管理多个Python版本conda会省掉你大量折腾编译和版本冲突的时间。我的建议是新手入门先用venv把虚拟环境的概念搞清楚等遇到需要切换Python版本或者装科学计算库频繁失败的时候再上conda。不要一上来就装Anaconda那玩意儿几个G装完你都不知道自己装了些什么。2.3 一个常见的误区很多人以为装了Anaconda就不需要venv了其实不是。conda环境里同样可以用venv再套一层但通常没必要。反过来venv环境里也可以装conda但这就更奇怪了。我的做法是一个项目只选一套环境管理方案不要混着用否则路径和依赖关系会变得非常混乱。另外要澄清一点conda和pip不是对立的。在conda环境里你照样可以用pip装包只是要尽量先用conda装conda找不到的再用pip。混用的时候有个原则——先conda后pip因为pip不会检查conda已经安装的依赖关系反过来则相对安全一些。3. venv实操从创建到日常管理3.1 创建虚拟环境的完整流程假设你已经装好了Python 3.x打开终端Windows用PowerShell或CMDmacOS/Linux用Terminal进入你的项目目录cd /path/to/your/project然后创建虚拟环境python -m venv .venv这里解释一下几个细节。python -m venv是调用venv模块的标准写法比直接敲venv命令更可靠因为它明确指定了用哪个Python解释器来创建环境。.venv是环境目录的名字前面加点是让它成为隐藏目录不会在文件列表里碍眼。你也可以叫venv、env、myenv随便什么都行但我建议统一用.venv这样一看就知道是虚拟环境目录。如果你系统里同时装了Python 3.8和3.12想指定用3.12创建环境可以这样python3.12 -m venv .venvWindows上如果python命令指向的不是你想要的版本可以用py -3.12 -m venv .venv来指定。创建完成后目录结构大概是这样.venv/ ├── bin/ (Windows上是Scripts/) ├── include/ ├── lib/ └── pyvenv.cfgpyvenv.cfg这个文件记录了环境的基本信息包括基础Python的路径和版本一般不需要手动改。3.2 激活与退出不同系统的操作差异创建完环境必须激活才能生效。激活的本质是把环境的bin或Scripts目录加到PATH最前面这样你敲python和pip的时候用的就是环境里的版本。Windows PowerShell.\.venv\Scripts\Activate.ps1Windows CMD.venv\Scripts\activate.batmacOS/Linuxsource .venv/bin/activate激活成功后终端提示符前面会出现(.venv)的标记。这时候你敲which pythonWindows上是where python应该指向.venv目录下的解释器。退出环境deactivate注意Windows PowerShell默认的执行策略可能禁止运行脚本如果激活时报“无法加载文件因为在此系统上禁止运行脚本”需要先执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser然后确认。这个操作只影响当前用户不会动系统全局设置。3.3 依赖安装与导出激活环境后用pip装包pip install requests flask numpy装完之后把当前环境的依赖导出成文件方便在其他机器或给同事复现pip freeze requirements.txt别人拿到这个文件后创建好环境执行pip install -r requirements.txt就能装出一模一样的依赖。这里有个坑要提醒pip freeze会把环境里所有包都导出包括你手动装的、作为依赖被自动装的全都在里面。如果环境用久了可能会混进一些跟项目无关的包。更精细的做法是用pipreqs这类工具它通过扫描代码里的import来生成依赖列表只包含项目真正用到的包。不过pipreqs有时候会漏掉动态导入的包所以导出后还是要人工检查一遍。3.4 环境迁移与重建的正确姿势虚拟环境目录本身是可以整个复制走的但我不推荐这么做。原因有两个一是环境里可能包含绝对路径换台机器路径变了就可能出问题二是环境目录体积不小复制起来慢而且容易带上一些缓存文件。正确的做法是在新机器上创建新环境然后用requirements.txt重新安装依赖。这样出来的环境干净、可复现而且能顺便验证依赖文件是否完整。如果项目要部署到服务器通常不会把整个虚拟环境传上去而是在服务器上创建环境后重新装依赖。Docker镜像里也是同样的逻辑在构建阶段创建环境并安装依赖。4. conda实操环境创建、包管理与版本切换4.1 安装condaMiniconda还是Anacondaconda有两个发行版Anaconda和Miniconda。Anaconda预装了几百个科学计算包体积巨大安装包几百MB装完几个G。Miniconda只包含conda和Python基础环境体积小得多需要什么包自己装。我的建议是装Miniconda。Anaconda预装的那些包你大概率用不到而且会让环境变得臃肿排查问题时干扰因素更多。Miniconda干净利落需要什么装什么可控性强。安装过程这里不展开官网下载对应系统的安装包一路下一步就行。Windows上安装时记得勾选“Add to PATH”或者安装完后手动把conda的路径加到环境变量里。macOS/Linux上安装脚本会问你是否执行conda init选yes这样它会自动帮你配置shell的初始化脚本。安装完成后打开一个新的终端执行conda --version能输出版本号就说明装好了。4.2 创建和管理conda环境创建一个指定Python版本的环境conda create -n myproject python3.10-n后面跟环境名python3.10指定Python版本。conda会自动下载对应版本的Python解释器和基础依赖。创建时顺便装几个包conda create -n myproject python3.10 numpy pandas matplotlib激活环境conda activate myproject退出环境conda deactivate查看所有环境conda env list或者conda info --envs删除环境conda remove -n myproject --all复制环境用于备份或创建相似环境conda create -n myproject_copy --clone myproject4.3 conda的包管理conda install与pip install的配合在conda环境里装包优先用conda install numpyconda会从它的频道里找预编译好的包安装速度快依赖关系处理得好。如果conda频道里没有或者版本不合适再用pippip install some-package这里有个关键原则先conda后pip。因为conda在安装时会检查整个环境的依赖一致性而pip只管自己装的包不会管conda已经装了什么。如果先pip装了某个包再用conda装另一个依赖它的包conda可能不知道pip已经装过了导致重复安装或者版本冲突。另外在conda环境里用pip时要确认pip指向的是当前环境的pip而不是全局的。激活环境后执行which pipWindows上是where pip确认路径在conda环境目录下。导出conda环境的依赖conda env export environment.yml这个文件包含了环境名、Python版本、所有conda包和pip包以及频道信息。别人拿到后执行conda env create -f environment.yml就能复现一模一样的环境。如果只想导出你手动装的包不包含依赖的细节可以用conda env export --from-history environment.yml这样导出的文件更简洁跨平台兼容性也更好因为不包含具体的版本号和构建号。4.4 Python版本选择3.8、3.10还是3.12Python版本的选择主要看你的项目依赖和框架支持情况。截至我写这篇文章的时候几个主流版本的情况是这样的版本状态适用场景3.8已停止维护老项目维护部分旧框架只支持到这个版本3.9维护中稳定兼容性好很多生产环境还在用3.10维护中推荐新特性与稳定性平衡得好3.11维护中性能提升明显适合新项目3.12维护中最新特性部分库可能还没跟上我的建议是新项目直接上3.10或3.11这两个版本在库支持和性能之间平衡得最好。3.12虽然新但有些库的兼容性还在跟进中如果项目依赖比较多可能会遇到装不上的情况。3.8除非是维护老项目否则不建议新项目再用。用conda切换Python版本很简单创建环境时指定就行conda create -n project_py38 python3.8 conda create -n project_py311 python3.11需要哪个版本就激活哪个环境互不干扰。5. 环境迁移、镜像配置与常见报错排查5.1 conda环境迁移到其他盘或目录Windows上C盘空间紧张是常态conda环境默认装在C盘用户目录下几个环境下来就能吃掉好几个G。把环境迁移到D盘或者其他盘有几种做法。第一种是在创建环境时就指定路径conda create -p D:\conda_envs\myproject python3.10-p参数指定完整路径这样环境就创建在D盘了。激活的时候也要用完整路径conda activate D:\conda_envs\myproject第二种是修改conda的默认环境目录。找到用户目录下的.condarc文件如果没有就新建一个添加envs_dirs: - D:\conda_envs这样以后创建环境默认就会放到D盘。第三种是直接移动已经创建好的环境目录然后修改conda的环境列表。这种做法我不太推荐因为环境里有些配置文件记录了原始路径移动后可能出问题。如果非要移移完之后用conda env list看看路径对不对不对的话手动改.condarc或者用conda config --append envs_dirs把新路径加进去。5.2 pip镜像源配置让装包速度快起来国内直接连PyPI官方源装包速度慢不说还经常超时。配置国内镜像源是最直接的提速手段。临时使用某个镜像源pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple永久配置在用户目录下创建pip文件夹里面新建pip.iniWindows或pip.confmacOS/Linux[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn常用的镜像源有清华、阿里云、中科大等选一个离你网络近的就行。配置完之后pip install默认就走镜像源了速度会有明显提升。conda的镜像源配置稍微复杂一点需要修改.condarc文件channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud配置完后执行conda clean -i清除索引缓存再装包就会走镜像源了。5.3 常见报错与排查速查表下面这些报错我几乎都遇到过整理成表格方便对照排查报错信息原因解决方法conda : 无法将“conda”项识别conda没加到PATH或没执行conda init重新安装时勾选Add to PATH或手动执行conda init后重开终端run conda init before conda activateshell没初始化conda执行conda init然后关闭终端重新打开ModuleNotFoundError: No module named xxx包没装或装到了别的环境确认环境已激活用pip list或conda list检查pip install速度极慢或超时没配镜像源配置国内镜像源Solving environment: failed依赖冲突conda找不到满足所有约束的版本组合尝试放宽版本限制或换用pip装或新建环境Permission denied没有写权限检查目录权限Windows上以管理员身份运行终端激活环境后python还是全局版本激活没生效或PATH顺序不对检查提示符是否有环境名which python确认路径conda activate后提示符没变化shell配置问题执行conda init重开终端一个我踩过的坑在Windows PowerShell里执行conda activate没反应后来发现是PowerShell的执行策略问题加上conda init powershell之后重开终端就好了。如果你用的是VSCode的集成终端配置完conda后记得重启VSCode否则终端可能还是旧的环境变量。5.4 VSCode中配置conda环境的要点VSCode里用conda环境核心是让VSCode知道你的conda装在哪、环境列表在哪。打开设置搜索python.condaPath填上conda的可执行文件路径。然后在项目目录下按CtrlShiftP输入Python: Select Interpreter选择你创建的conda环境。如果列表里没有你的环境可能是conda路径没配对或者环境创建在了非默认目录。手动添加解释器路径也行指向环境目录下的python.exeWindows或bin/pythonmacOS/Linux。VSCode的终端默认可能不会自动激活conda环境可以在设置里搜索python.terminal.activateEnvironment确保它是勾选状态。这样每次打开终端会自动激活选中的环境。6. 我个人的环境管理习惯与几条实用建议6.1 项目目录结构约定我习惯在每个项目根目录下放一个.venv目录用venv时或者不把conda环境放在项目里conda环境统一放在envs_dirs指定的目录。项目里只放代码、配置文件和依赖声明文件。这样项目目录干净复制和备份的时候不会带上几个G的环境文件。依赖声明文件我一般会同时维护requirements.txt和environment.yml前者给用venv的人后者给用conda的人。虽然有点重复但团队里每个人习惯不同多写一个文件省去很多沟通成本。6.2 环境命名规范conda环境名我建议跟项目名保持一致比如项目叫web-scraper环境就叫web-scraper。不要用test、env1、myenv这种名字过两个月你自己都忘了哪个环境是干什么的。如果项目有多个版本分支需要不同环境可以加后缀比如web-scraper-py38、web-scraper-py311。6.3 定期清理不再使用的环境conda环境用久了会积累很多不再使用的占空间不说conda env list列出来一大串也影响查找。定期用conda remove -n 环境名 --all删掉不用的环境。pip的缓存也可以用pip cache purge清理conda的缓存用conda clean --all清理。6.4 关于“免费Python源码大全”这类搜索词经常看到有人搜“免费Python源码大全”想找现成的代码来学习或直接用。我的建议是源码可以看但不要直接复制粘贴到项目里。每个项目的环境配置、依赖版本、代码风格都不一样直接抄过来的代码很可能跑不起来或者引入一堆你不需要的依赖。更好的做法是理解源码的思路然后在自己环境里重新实现一遍这样既学到了东西又保证了环境的干净可控。6.5 一个容易被忽略的细节pip和conda的版本更新pip和conda本身也是需要更新的。pip更新用python -m pip install --upgrade pipconda更新用conda update -n base conda。版本太旧有时候会导致装包失败或者解析依赖变慢。但也不要频繁更新尤其是生产环境更新前先在测试环境验证一下。环境管理这件事说复杂也复杂说简单也简单。核心就一句话每个项目独立环境依赖声明清楚版本选择看项目需求。把这几条做到位90%的环境问题都能避免。剩下的10%遇到报错的时候别慌按报错信息搜一下大概率别人已经踩过同样的坑了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑