
先看个真实案例。上周有位读者找我说他电脑里Python版本是3.9装了一堆包后来为了跑一个新项目装了个要求Python 3.11的库结果系统被搞得一团糟——原来能跑的脚本报错pip list乱成一锅粥最后只能花一个下午重装系统Python。我听了只能叹气这就是没用虚拟环境的典型下场。虚拟环境这个东西说白了就是给每个项目开一个独立的Python运行空间项目A用了pandas 2.0项目B用pandas 1.5两边互不干扰。很多人刚上手Python时没有这个概念直接在全局环境里装包等项目管理一多就知道疼了。而PyCharm作为最主流的Python IDE之一其实把虚拟环境的创建流程做得非常顺手只不过新手往往找不到入口、搞不清选项含义。这篇文章就是手把手带你走一遍在PyCharm里新建虚拟环境并在日常开发中使用。我会把图形界面操作、命令行操作、常见报错排查一条龙讲完尽量细致到每个按钮保证零基础也能看懂。如果你是已经在用PyCharm但一直没用上虚拟环境的老手这篇同样能帮你补上这块短板。1. 虚拟环境到底做了什么先搞懂原理再动手不管你是用PyCharm还是其他工具你要是不明白虚拟环境背后的机制后面遇到各种诡异报错还是会懵。所以我先花点篇幅把原理讲清楚这部分不复杂看一遍就懂。1.1 一套PythonN个小房间用生活例子理解venv想象一下你租了一间大公寓公共厨房里有各种调料和厨具这就是全局Python环境。你做饭用的豆瓣酱和邻居用的豆瓣酱都摆在同一个架子上哪天邻居买了一瓶更辣的豆瓣酱回来把标签贴到你的瓶子上你做饭时一用味道全变了——这就是全局环境里依赖冲突的日常。虚拟环境解决这个问题的思路很朴素给每个项目分配一间带独立小厨房的房间锅里放什么调料、架子上摆什么牌子全由你自己决定和外界完全隔绝。用专业的话说虚拟环境是一个包含独立Python解释器、独立的site-packages目录、独立的脚本入口的目录树。你在这个环境里pip安装的任何包都只写进这个环境的site-packages不影响系统里其他项目的Python。1.2 虚拟环境的三个关键组成解释器、site-packages、激活脚本一个Python的venv虚拟环境创建完成之后目录结构大致是这样venv/ ├── bin/ # Linux/macOS可执行文件目录 │ ├── activate # 激活脚本 │ ├── python # 虚拟环境内的Python解释器 │ └── pip # 虚拟环境内的包管理工具 ├── include/ # C语言头文件目录 ├── lib/ # Python标准库和site-packages │ └── python3.10/ │ └── site-packages/ └── pyvenv.cfg # 环境配置文件Windows下bin目录叫Scripts里面是activate.bat、Activate.ps1、python.exe和pip.exe等。三个关键点你记住就够了pyvenv.cfg这个文件只有几行记录了虚拟环境对应的基础解释器路径home键和版本信息。PyCharm、VS Code这些工具识别虚拟环境靠的就是这个文件。site-packages每个环境专属的包安装位置pip install的包默认都会装到这里。这也是隔离的核心所在。激活脚本激活的本质就是修改当前终端的PATH环境变量把虚拟环境目录排在最前面。这样你在终端里敲python命中的就是虚拟环境里的那个解释器而不是全局的。还有个判断当前是否在虚拟环境里的土办法在终端里跑一段Python代码。import sys print(sys.prefix) # 当前环境路径全局环境显示的是Python安装目录 print(sys.base_prefix) # 基础解释器路径虚拟环境里两者不同如果sys.prefix和sys.base_prefix不相同说明你已经处于某个虚拟环境中了这个技巧在排查环境问题时特别管用。1.3 为什么PyCharm这么执着于虚拟环境用过PyCharm的人应该都有印象创建新项目时它默认就给你勾选创建一个venv虚拟环境。这不是PyCharm多此一举而是因为虚拟环境是Python项目工程化的最佳实践。想象一下你带着一个Python项目换电脑或者拉一份团队的代码到本地最怕听到一句话在我电脑上是好的啊。这句话八成就是环境不一致闹的。有了虚拟环境配合一份requirements.txt或pyproject.toml依赖清单任何人拿到项目一条命令就能把依赖装齐且不会污染自己的系统环境。PyCharm官方对虚拟环境的支持也最上心它能自动识别项目里有没有venv目录自动在终端激活虚拟环境在设置里可视化地管理每个项目的解释器。这也是我推荐新手直接用PyCharm来操作虚拟环境的原因——它把很多细节都帮你处理好了。2. 用PyCharm图形界面新建虚拟环境从零到能跑这一章是重点中的重点。我会分几种场景讲新建项目时顺手创建虚拟环境、给已有项目配置虚拟环境、以及和Anaconda结合使用的场景。2.1 新建项目时顺带创建虚拟环境最省事的方式打开PyCharm在最开始的欢迎界面选择New Project或者菜单栏File New Project进入新建项目对话框。这个界面不同版本布局有差异但核心要素不变。以PyCharm 2023以后的版本为例你会看到Location项目文件要放在哪里路径里尽量不要有中文和空格原因后面踩坑部分会讲。解释器类型选择一般默认是Venv也可以切换成Conda、System Interpreter等。Base interpreter基础解释器就是你这台机器上已有的Python版本。点击右侧下拉框选择你想要的Python版本。如果你的机器装了多个Python版本这里都能列出来。有个容易忽略的细节界面里通常还有一个Python Version的选项这是指你要创建的新虚拟环境使用哪个Python版本。如果下拉菜单是灰的或者没有这个选项说明PyCharm没有识别到你本机安装的免费Python解释器回去先把Python本体装好再重试。把这个对话框填好之后点击Create按钮。PyCharm会自动完成这些事创建项目目录、在项目目录下创建venv文件夹、把基础解释器的Python文件复制或链接到虚拟环境里、自动设置为当前项目的解释器。等右下角的进度条跑完你会看到项目结构树里多了一个venv目录这时你的项目就已经拥有独立虚拟环境了。2.2 给已有项目添加虚拟环境解释器配置入口如果你的项目已经存在比如从网上下载的开源项目或者你之前用了系统解释器现在想换成虚拟环境操作方式略有不同。进入File SettingsWindows/ PyCharm PreferencesmacOS找到Project: 你的项目名 Python Interpreter点右侧齿轮菜单或Add Interpreter按钮。不同版本入口可能叫Add Interpreter、Add Local Interpreter之类本质都是一样的。在弹出的对话框里选择Virtualenv Environment然后根据你的情况选New还是ExistingNew新建一个虚拟环境。Environment location默认是项目根目录下的venv文件夹也可以改成其他路径。Base interpreter选基础Python版本下面还有个Inherit global site-packages复选框就是问你要不要继承全局环境里已装的包一般不用勾勾了就不纯净了。Existing把项目关联到已有的虚拟环境。直接定位到已有venv目录下的Python解释器路径Windows是Scripts/python.exemacOS/Linux是bin/pythonPyCharm会自动识别并加载环境信息。选好之后点OKPyCharm会花几秒钟扫描环境。等右侧解释器列表更新了项目用的就是新的虚拟环境了。这个操作路径需要记一下因为后面所有的环境管理比如换解释器、装包、删除环境都要从这个入口进去。2.3 三种创建方式怎么选venv/conda/系统解释器PyCharm里创建环境时一般会看到几种不同的环境类型我见过不少人在这里犯晕。直接给结论用一张表格说明白。环境类型底层机制适用场景文件位置VirtualenvvenvPython自带虚拟环境绝大多数普通Python项目项目目录下的venv文件夹Conda Environment通过Anaconda/Miniconda管理数据科学、机器学习教育、需要指定Python版本切换由conda统一管理通常在Anaconda的envs目录System Interpreter直接使用全局Python临时脚本、简单测试不推荐日常开发系统全局路径Pipenv / Poetry第三方打包的依赖管理工具有依赖锁定需求的工程化项目Pipfile / pyproject.toml管理对于入门和绝大多数普通项目直接选Virtualenvvenv就对了轻量、可控、不依赖额外的包管理工具。用Conda的场景主要是Python版本切换频繁或者你平时已经习惯用conda命令管理环境了。System Interpreter我不建议日常使用前面那个公共豆瓣酱的例子就是教训。2.4 集成Anaconda环境把conda虚拟环境交给PyCharm关于Conda和Anaconda这个知识点不少人在设置里卡过我再单独展开讲讲。如果你本机已经装了Anaconda想用conda创建虚拟环境再交给PyCharm使用有两种路线第一种在创建新项目时解释器类型直接选Conda Environment点Create会自动基于conda的默认Python版本建一个环境。这种方式适合项目刚起步、环境从零开始。第二种先在命令行里用conda创建环境conda create -n myenv python3.10 -y然后在PyCharm的解释器设置里走Add Interpreter Conda Environment Existing environment找到这个myenv环境对应的Python解释器。怎么找路径在命令行里执行conda env list输出结果里会列出每个环境的路径比如/Users/yourname/anaconda3/envs/myenv然后去这个目录下选中python.exeWindows对应的Python解释器即可。这里要提醒一句不要把conda环境路径和venv路径搞混。conda环境由conda统一管理删除、升级都是conda的命令而venv是项目目录下的一个普通文件夹删掉即废除。它们在PyCharm里虽然都叫虚拟环境但管理方式完全不同。3. 在PyCharm的终端里手动创建虚拟环境没那么玄乎用图形界面操作确实方便但我还是建议你学会用命令行创建虚拟环境。为什么因为很多时候你是在没有PyCharm的环境里工作比如远程服务器、CI构建流程或者你想写一个自动化脚本部署环境。命令行是通用手段图形界面只是把命令行包了一层壳。3.1 python -m venv这行命令的完整拆解创建虚拟环境最基础的一行命令python -m venv venv这行命令的含义拆开来看python你的基础Python解释器。如果你的机器同时装了Python 3.9和3.11想指定版本就要写成python3.11 -m venv venv或者/usr/bin/python3.10 -m venv venv前提是这些解释器已经加入了系统PATH。-m venv以模块方式调用Python标准库中的venv模块。最后一个venv要创建的虚拟环境目录名也习惯叫venv不过你可以随意改成.myenv、venv_bk等只要自己认得清楚。执行完成之后当前目录下就会多出一个venv文件夹一个全新的虚拟环境就建好了。整个过程几秒钟因为venv不会复制整个Python安装包而是通过pyvenv.cfg文件建立与基础解释器的关联再创建独立的site-packages目录。它只复制必要的可执行文件和启动器所以非常轻量。3.2 Windows和macOS/Linux的激活与退出命令环境创建好了要先激活才能使用。激活的语义前面已经说过就是把虚拟环境的目录排到PATH最前面。WindowsCMDvenv\Scripts\activateWindowsPowerShellvenv\Scripts\Activate.ps1macOS / Linuxsource venv/bin/activate激活成功后终端命令提示符前面会多个(venv)的前缀类似这样(venv) C:\Users\you\project这时候你再敲python、pip用的就是虚拟环境里的了。退出虚拟环境的命令所有平台都一样deactivate退出后提示符前面的(venv)消失环境就切回全局了。如果激活时遇到PowerShell报错提示禁止运行脚本这是因为系统默认的执行策略限制解决办法是在PowerShell里执行一次Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser这是一个常见的新手卡点顺手记下来免得临时抓瞎。当然你也可以在PyCharm右下角的终端里操作——PyCharm的Terminal面板在较新版本里默认会自动激活项目的虚拟环境你打开终端直接就是(venv)状态属于半自动体验。3.3 进阶用uv快速创建虚拟环境以及离线场景的做法最近社区里比较火的一个工具叫uv是Rust写的一个极速Python包管理器创建虚拟环境和安装依赖的速度比传统pip快好几倍。如果你愿意尝鲜用它创建虚拟环境也就一行命令uv venv然后在PyCharm的解释器设置里通过Existing环境把这个.venv目录指定给项目即可。uv默认创建的目录名是.venv在文件树里默认隐藏比较干净。另外很多做内网开发、生产环境部署的同学会碰到一个很现实的问题目标机器没有外网不能pip联网下载。这种离线场景下虚拟环境依然可以用思路是这样的在有网的机器上先在虚拟环境里把所有依赖装好然后执行pip download -r requirements.txt -d ./offline_packages把生成的offline_packages目录整个拷到离线机器上再在虚拟环境里执行pip install --no-index --find-links/path/to/offline_packages -r requirements.txt注意pip download不能跨平台你要确保下载的wheel包和目标机器是同一个操作系统、同一个Python版本否则极可能安装失败。这一点在上线前一定要验证一遍。所谓无网络电脑搭建Python虚拟环境总结下来就这三板斧先venv建环境、再离线灌包、最后用真诚的心祈祷依赖写全了。4. 把虚拟环境用起来包安装、项目配置、日常开发环境建好了问题来了怎么把项目跑起来怎么装依赖怎么跟队友保持环境一致这一章讲的是虚拟环境的日常使用。4.1 在PyCharm里安装依赖包管理器的正确打开方式在虚拟环境里安装第三方库最直接的方式是用pip命令行pip install pandas pip install requests前提是你已经激活了对应环境的终端。如果在PyCharm里面操作还有两条路线可以走一是通过解释器管理界面File Settings Project Python Interpreter看到当前环境下的包列表后点列表下方的号按钮弹出包搜索框输入包名点Install PackagePyCharm会用当前环境的pip来完成安装。这个界面还能看到已安装包的版本点击可以选中版本号进行强制指定。二是用PyCharm底部的通知条。当你编写import语句时按下快捷键macOS是OptionEnterWindows是AltEnterPyCharm给出Install package pandas的快捷操作点一下就会自动装进当前虚拟环境。这个省事很多但对新手隐藏了一个风险如果当前项目解释器还是全局的装包就装到全局去了你以为是项目在用其实是污染系统。这就是为什么我建议你在动手写代码前先确认PyCharm右下角显示的当前解释器是venv还是全局Python。国内网络环境下pip默认从官方源下载速度不够理想时可以临时换国内镜像加速pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple这个命令只是这次安装临时生效不会修改全局配置。如果要长期固定可以在用户目录下pip.conf或pip.ini里配置index-url这一步是可选的但确实能省下不少等待时间。4.2 用requirements.txt锁住环境依赖等你的项目依赖装得差不多了就该考虑把依赖清单导出来。在PyCharm终端里执行pip freeze requirements.txt这句话会把当前环境里所有包及其版本号写入requirements.txt文件。这个文件放进Git或者压缩包发给队友对方只要在项目目录下运行pip install -r requirements.txt就能把一模一样的环境装回来。这就是环境一致性的标准做法也是虚拟环境配合团队协作最大的价值所在。这里有一个细节要注意pip freeze会把当前虚拟环境里所有包都列进去包括传递依赖就是某个依赖自己又依赖的包。如果你的项目里有些包只是试装了一下后来发现没用建议手动从requirements.txt里删掉保持清单干净。如果你想要更精细的依赖管理可以研究一下pip-tools的pip-compile、或者poetry这些工具但那是另一个话题新手阶段用requirements.txt完全够。4.3 多项目复用虚拟环境还是每个项目单独建有读者问过我有一堆小项目每个项目都建虚拟环境是不是太浪费了能不能共用一个环境我的回答是如果你只是写几个几十行的小脚本临时共用一个虚拟环境问题不大反正也不会有复杂的依赖冲突。但只要有了一点规模或者项目生命周期超过一个月我还是强烈推荐每个项目独立环境。原因有两个。第一项目之间的依赖很容易出现版本踩踏。项目A需要Django 3.2项目B需要Django 4.2你共用一个环境就只能二选一或者来回切换重装。第二独立环境有一点好删掉整个venv文件夹就是彻底卸载系统不会残留任何垃圾。你想想用全局环境装了一堆包之后想清理都不知道哪些是哪个项目要用的。当然也不是说每个虚拟环境都要数据零共享。如果你有一些特别重的依赖比如torch这种好几个G的包每个项目都装一遍确实肉疼。这时候可以考虑之间用继承全局site-packages或者共用同一个venv作为基础环境再用pip安装各个项目特有的包。不过这种情况建议等你有经验了再玩新手不要一开始就搞这些骚操作。还有一件事要提醒venv文件夹不要提交到Git仓库。它的体积不小而且里面包含本机路径信息别人拉下来不一定能直接跑。标准做法是把它加进.gitignore只提交requirements.txt通过pip install -r requirements.txt来恢复环境。5. 我踩过的坑和排查思路这些报错别慌这一章我把自己这几年见过的高频翻车现场全整理出来每个问题都给全排查链路别上来就直接照最后一条改那样以后遇到新问题还是不会排查。5.1 问题一运行的还是全局解释器虚拟环境形同虚设症状在PyCharm里明明看到项目设置了venv环境运行脚本时用的还是系统的解释器或者Python导入的路径不对。排查链路第一步在PyCharm里运行一行代码看路径import sys print(sys.executable)如果输出路径是venv目录下的python解释道那说明解释器配置正常。如果输出的是/usr/bin/python或C:\Python311\python.exe那说明运行配置没走虚拟环境。第二步检查运行配置Run Configuration。看右上角的运行下拉框找到当前脚本的配置点Edit Configurations确认Python interpreter选项选的是Project Default还是循环里明确指定的哪个环境。第三步检查PyCharm的设置项。进入Settings Project Python Interpreter看右侧列表的当前项目解释器是不是venv路径。如果是全局的按前面2.2节的步骤重新指定。经验之谈大概率是你在某次操作中PyCharm询问是否切换解释器时手滑选了全局或者项目是从别处拷来的自带的.idea目录记录了之前的解释器路径。解决办法就是重新指定一次解释器再重启一下终端。5.2 问题二用命令行pip装好了包PyCharm里还是ModuleNotFoundError症状在PyCharm终端里pip install xyz成功返回Successfully installed但运行代码时import xyz报错ModuleNotFoundError。排查链路第一步先在终端里看看pip到底装到哪个环境了pip --version输出里会带pip安装路径。如果显示的是venv\Scripts\python.exe -m pip说明包装进了虚拟环境。如果显示的是/usr/local/bin/python说明你虽然人在项目里但环境没激活或者Windows上venv根本没自动激活包装到全局去了。第二步确认PyCharm运行脚本用的是什么解释器。按5.1节的方法看sys.executable如果和pip安装用的环境对不上自然就导入不了。第三步如果两边都对上了还是报错很可能是PyCharm的索引缓存错了。菜单File Invalidate Caches勾选Clear file system cache and Local History点Invalidate and Restart重启后重新构建索引就好了。这个问题不算常见但我确实碰到过两三次尤其是刚删除再重建venv之后。这个坑的根源说到底是安装包的环境和运行代码的环境不一致。新手往往在终端里用全局pip装包又在PyCharm里的venv环境跑代码两边互不相认。记住装包前先确认环境激活跑代码前再确认一次环境路径双确认之后很难出问题。5.3 问题三pip安装某个包报错Microsoft Visual C 14.0 is required症状Windows下在虚拟环境安装pandas、scrapy、pymssql这类包含C扩展的包时报错error: Microsoft Visual C 14.0 or greater is required. Get it with Microsoft C Build Tools排查链路第一步先确认你当前Python版本。如果是Python 3.8及以上绝大多数主流包在官方源都有预编译好的wheel包.whl不该触发源码编译。如果你用的Python版本太老比如3.7或更旧pip会尝试从源码编译就很容易缺编译器。第二步看看包本身有没有预编译版本。随便搜一下包名加wheel很多包的GitHub Release页面会提供对应的whl文件。或者你直接用pip装这个包的特定版本有时新版没有wheel但旧版有。第三步如果确实需要编译那就老老实实装Microsoft C Build Tools。在微软官网下载Build Tools安装时勾选使用C的桌面开发把Windows 10/11 SDK那几项一并勾上安装完重启电脑再装包。这个坑大多数情况下都可以通过升级Python版本来绕开。比如Python 3.11的pandas、numpy都有现成的wheel不用装任何编译器。所以我的建议是虚拟环境虽然能隔离包但Python版本本身要选新一点的别守着老版本不放。5.4 问题四路径含中文、环境复制给别人失效、删除环境不彻底这些零碎的坑我合并到一起说。路径含中文导致虚拟环境出问题主要出现在Windows环境下。激活脚本里有些路径处理得不够健壮如果你把项目放在类似D:\我的项目\爬虫这种路径下有可能出现activate后提示找不到文件、或者PyCharm识别不了环境的情况。解决办法只有一个项目目录尽量用英文层数也别太多。这一步建议你在新建项目前就想好。虚拟环境复制给别人失效这个坑的本质是venv目录里嵌入了绝对路径。比如pyvenv.cfg文件里记录的home路径是C:\Users\你的名字\AppData\Local\Programs\Python\Python311别人的机器上不一定有这个路径。激活脚本里的硬编码路径也会跟着失效。所以你不会看到任何有经验的人把venv文件夹整个打包发给别人一律用requirements.txt来处理。删除虚拟环境不彻底的情况主要是PyCharm的缓存没有清理。你手动删掉了venv文件夹但Python Interpreter设置里还残留着这个环境的记录。解决办法是在Settings里先把环境从项目解释器列表移除再删文件夹这样PyCharm的缓存同步清掉。如果你已经直接删了文件夹导致PyCharm显示红色错误路径重新打开Settings把解释器改成别的有效环境再改回来即可。还有一个隐藏比较深的坑Windows下PowerShell运行Activate.ps1时提示因为在此系统上禁止运行脚本这个我在3.2节写过了Set-ExecutionPolicy那条命令开个权限问题就解除不需要去改什么组策略。最后再啰嗦两句我自己的使用习惯写这么多年Python项目我在PyCharm里对自己虚拟环境管理的默认习惯是三条新建项目必选venv环境、venv目录一律不提交Git、所有依赖由requirements.txt统一管理。这三个习惯帮我躲过了无数次环境崩溃的灾难也希望你能直接抄走。如果你刚学完这篇文章建议你现在就打开PyCharm从新建一个虚拟环境项目开始跑通一个最简单的脚本亲手完成一次pip install import的闭环。动手走一遍比看十遍教程都管用。后面要是再遇到什么幺蛾子报错记住先查两边环境问题基本都出在环境和代码的交叉点上。