尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python虚拟环境完全指南:venv、pip与PyCharm实践

Python虚拟环境完全指南:venv、pip与PyCharm实践 1. 先搞清楚Python虚拟环境到底解决了什么如果你是刚入门的Python学习者或者是刚刚从写脚本迈向做项目的开发者大概率会碰上这样一个场景项目A要用Django 3.x项目B要用Django 4.x两个项目在同一台电脑上如果你直接用系统全局的Python环境那今天装这个版本明天换那个版本来回倒腾不说还经常出现“这边能跑、那边报错”的尴尬局面。这时候Python虚拟环境就派上用场了。虚拟环境的本质就是给每个项目创建一套独立的Python解释器和独立的第三方库目录。你可以把它理解成每个项目都拥有一间自己的“工具房”里面放着自己那套螺丝刀、扳手互不干扰。全局环境则是所有人共用一间大仓库谁都能往里面塞东西也谁都会被别人塞的东西影响。在本篇里我会把Python虚拟环境的基础原理、pip包管理器的常用操作、以及PyCharm里面的集成实操一次性讲清楚。无论你是刚装好Python的小白还是已经写了一段时间但一直没搞明白虚拟环境的老手这篇指南都能帮你在30分钟内建立起一套清晰、可复用的环境管理方法论。我假设你已经在Windows上完成了Python的基础安装。如果是macOS或Linux命令会略有差异我会在关键位置补一句说明。这篇只讲核心机制和可复现的操作不搞教科书式说教更不推荐那种“复制粘贴跑通就算完”的教程风格——我会把每个操作背后的“为什么”也讲到位。2. 虚拟环境的核心机制与创建流程2.1 venv和virtualenv我怎么选Python官方从3.3版本开始内置了venv模块它就是用来创建虚拟环境的。到了Python 3.4以后venv已经足够成熟很多第三方工具比如virtualenvwrapper的便捷能力在官方方案里也已经能靠若干条命令搞定。我们先做一个对比帮你决定用哪个对比项venv官方内置virtualenv第三方安装成本无需额外安装需要pip install virtualenvPython版本支持只支持创建当前解释器版本的环境可以通过参数指定其他版本前提是本机装了对应版本执行速度稍快稍慢但差别在实际使用中几乎无感生态兼容绝大多数场景完全够用老项目或特殊部署场景可能用到推荐程度新项目首选仅在特殊需求下使用我的建议非常简单除非你有特别的老项目依赖virtualenv否则直接用venv零额外依赖、官方维护、不会踩第三方工具的坑。2.2 官方标准操作用venv创建虚拟环境在Windows的命令行CMD或PowerShell里先进入你的项目目录比如cd D:\projects\my_blog然后执行python -m venv venv这里有两个“venv”第一个是模块名第二个是虚拟环境目录名。我习惯把虚拟环境目录命名为venv这样一看就知道。当然你也可以命名为env、.venv、myenv等随你喜好但建议在团队协作时统一个标准比如都用.venv这样带点的隐藏目录更干净。这条命令执行完毕后项目目录下会多出一个venv文件夹里面有ScriptsWindows或binmacOS/Linux存放激活脚本、pip、python等可执行文件Lib或lib存放该虚拟环境下的第三方库pyvenv.cfg记录这个虚拟环境对应的Python版本和路径信息你可以打开这个文件看一看就会发现它指向的是你创建时用到的那个Python解释器的路径。这就是“虚拟”的真正含义它并不是重新编译了一套Python而是在已有Python的基础上把你的第三方依赖隔离在一个独立目录里。2.3 激活与退出别把命令记反了创建完毕第二步是激活。Windows下是venv\Scripts\activatemacOS/Linux下是source venv/bin/activate激活后命令行前面会出现一个(venv)前缀这就表示你现在正处在虚拟环境中。这时候你执行python用的就是虚拟环境里的Python执行pip安装的包也会进到虚拟环境的Lib\site-packages里。退出虚拟环境很简单Windows和macOS/Linux通用deactivate有个很容易记错的地方Windows的bat脚本是activate.bat如果你在CMD里直接输入activate也能识别在PowerShell里则建议输入.\venv\Scripts\Activate.ps1。有些人的电脑因为执行策略设置PowerShell会阻止运行激活脚本报错信息通常是“无法加载文件 ...因为在此系统上禁止运行脚本”。解决办法是在管理员权限的PowerShell里执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser这个操作是当前用户范围内放开本地脚本执行权限只影响你自己的用户账户不涉及系统级安全变更。如果公司电脑有统一安全策略建议先咨询管理员。2.4 删除与重建虚拟环境是消耗品很多初学者把虚拟环境当成一个“安装完就不能动”的东西其实完全不是。虚拟环境本质上就是一堆文件不想要了直接删掉venv文件夹即可对系统没有任何残留污染。如果项目依赖搞乱了比如装错一个包、依赖冲突严重与其费劲排查不如删除venv重新创建、重新安装依赖。配合requirements.txt十几秒就能恢复一个干净的环境。这也是我强烈建议所有项目从第一天就把requirements.txt用起来的原因。3. pip包管理器的核心操作与踩坑指南3.1 pip是什么以及它和虚拟环境的关系pip是Python官方推荐的包管理器负责把PyPIPython Package Index上的第三方库下载并安装到你的环境中。它的本质是一个命令行工具使用时会到远程仓库下载文件解析依赖然后写入site-packages目录。这里要重点强调一点pip安装的位置取决于你当前正在使用的是哪个Python环境。如果你没有激活任何虚拟环境pip默认装到系统全局Python里。如果你激活了某个虚拟环境pip就只装到这个虚拟环境里。很多入门者踩的“我已经装了为什么项目还是找不到”的坑十有八九就是装到全局环境了而项目使用的是另一个解释器。在项目里我建议养成一个检查习惯。先看当前python路径where pythonWindows下会输出当前激活环境下的Python路径。然后再看pip路径where pip如果两者指向同一个虚拟环境目录那么你接下来的安装命令都会作用在这个环境里就没问题。3.2 pip安装、卸载、查看、导出依赖一套命令全搞定最常用的pip操作我整理成一张速查表操作命令示例说明安装包pip install requests安装最新版安装指定版本pip install requests2.31.0精确锁定版本安装最低版本pip install requests2.20指定版本区间升级包pip install --upgrade requests升级到最新版卸载包pip uninstall requests卸载会确认是否删除查看已安装pip list列出当前环境所有包查看特定包pip show requests查看该包详情、依赖关系导出依赖pip freeze requirements.txt把当前环境所有包及版本写入文件按清单安装pip install -r requirements.txt从文件批量安装其中pip freeze requirements.txt非常重要。当你要在新电脑上重建项目环境或者在服务器上部署时只要有这个文件一条命令就能装回所有依赖。这个文件要提交到代码仓库里团队其他成员就能一键复现环境。不过也要注意pip freeze会导出当前环境所有包包括某些依赖的依赖偶尔会有冗余。如果项目有更精确的要求可以用pip-tools或poetry这类工具来管理依赖但对于大多数人来说requirements.txt足够用了。3.3 pip国内源实测最快的换源方式pip默认从PyPI官方仓库下载在国内访问速度很慢甚至经常超时。解决的办法是使用国内镜像源。我实测下来清华源TUNA和阿里源都比较稳定。永久配置的方法是在用户目录下新建pip.ini文件Windows或pip.confmacOS/Linux写入如下内容[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host pypi.tuna.tsinghua.edu.cnWindows下这个文件路径一般是C:\Users\你的用户名\pip\pip.ini如果没有pip文件夹手动新建一个即可。如果你不想永久改配置只想单次临时换源可以这样pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple还有一种情况是公司内网有私有PyPI源那就在命令行里用--index-url指向内网地址就行。这里顺带提一个我在实际工作中遇到的场景有些电脑上pip换源后安装仍然很慢排查发现是系统代理设置冲突pip会走代理去访问结果代理本身不稳定。解决办法是临时设置--proxy为空或关闭系统代理再试。3.4 常见pip报错的排查思路之前在热搜词里面看到几个典型的pip报错这里集中解答一下。第一个pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称这个报错十有八九出现在Windows下原因是pip对应的可执行文件路径没有加入到系统的PATH环境变量里。你可以在安装Python时勾选“Add Python to PATH”或者手动把C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\Scripts以你的实际Python版本和安装位置为准加到系统PATH里。加了之后重开一个命令行窗口再执行pip --version验证。第二个pip did not provide a command这个报错通常不是pip本身出问题了而是某次安装的包在Scripts目录下生成的可执行命令名和你输入的不一致。比如你装了一个包文档里说命令是xxx但实际生成的是xxx-cli之类。解决办法是先看看Scripts目录下到底生成了哪些exe文件找到真正的命令名再调用。第三个安装某个包时提示“connection error”或者一直卡住这大概率就是网络问题按照上面讲的方式换国内源即可。如果换源后仍然报错可以尝试pip install --timeout 60增加超时时间或者关掉系统代理再试。4. PyCharm集成虚拟环境的完整实操4.1 PyCharm新建项目时直接创建虚拟环境PyCharm是目前最主流的Python IDE社区版免费且已经足够好用。新建项目时PyCharm会默认帮你创建一个虚拟环境这个设计我觉得比很多命令行操作都更亲民。新建项目的界面里展开“Project Interpreter”或“Python Interpreter”相关选项通常有一项是New environment using下拉选择Virtualenv。定位到你本机的Python解释器路径PyCharm就会自动在该项目下创建venv目录。创建完成后你打开Terminal标签页会发现命令行前面自动带着(venv)前缀说明它已经自动激活了虚拟环境。这个方案最大的优点是“零命令操作”。新手不需要先手动创建venv再手动激活PyCharm全程接管了。而实际运行代码时PyCharm也默认使用这个虚拟环境来执行不会出现“命令行能用IDE里找不到包”的问题。4.2 已有项目如何切换或配置虚拟环境如果你已经有一个项目早期是用全局环境跑的现在想把它迁移到虚拟环境在PyCharm里的操作也不复杂。打开File - Settings - Project - Python Interpreter点击齿轮图标选择Add Interpreter - Add Local Interpreter然后选择Virtualenv Environment。这里有两个选项New environment让你新建一个虚拟环境并指定基础Python解释器Existing environment让你选择已经存在的虚拟环境路径选好后PyCharm会重新索引项目依赖之后运行脚本时就会自动使用该虚拟环境了。我在实际工作中碰到过一种情况同事把项目从A电脑拷贝到B电脑B电脑上PyCharm打开后报了大量的包缺失错误原因就是解释器仍然指向A电脑的Python路径。这种问题在团队协作时特别常见解决办法就是按上面的步骤把解释器重新指向B电脑的虚拟环境然后根据requirements.txt重新安装依赖。4.3 PyCharm安装pandas等包的正确姿势在PyCharm里安装第三方库最简单的路径是Settings - Project - Python Interpreter你会看到一个包列表左下角有一个号点击后会弹出搜索框输入包名如pandas选择版本点击Install Package。这里我建议把下方的Install to users site packages directory选项保持不勾选因为勾选后会把包安装到全局用户目录和虚拟环境隔离的初衷相违背。安装过程中PyCharm会显示进度装完会在包列表里出现这个包。不过在实际使用中我更喜欢直接打开PyCharm的Terminal手动输入pip install pandas原因有二。第一命令行能看到更详细的安装日志如果某个依赖下载失败你能直接看到是哪个包哪个版本的问题。第二Terminal默认已经激活虚拟环境与项目环境天然一致不会有装错地方的风险。4.4 用PyCharm终端手动创建和切换环境的经验PyCharm底部的Terminal实际上打开的就是一个shell窗口它默认会自动激活当前项目配置的虚拟环境。所以你在里面执行python xxx.py时用的就是当前项目的解释器。如果你发现Terminal没有自动激活虚拟环境比如没有出现(venv)前缀那通常是PyCharm的终端配置问题。解决办法是在Settings - Tools - Terminal里确认Shell path设置正确Windows下默认应该是cmd.exe不要改成奇怪的路径。另外在Windows下使用PyCharm内建Terminal时如果你手动执行过activate再切换分支或重启项目后机器可能会保留之前的虚拟环境激活状态。遇到这种情况先deactivate再重新激活目标环境的脚本或者干脆关掉终端标签页重新开一个。5. 虚拟环境与项目管理的进阶经验5.1 requirements.txt在团队协作中的正确用法我经常在代码评审时看到这样的场景项目推到仓库里README里写了一句“先pip install -r requirements.txt”但仓库里根本没有这个文件。或者有但里面内容特别乱一堆pkg-resources0.0.0之类的垃圾依赖。正确生成requirements.txt的方式是pip freeze requirements.txt但要注意pip freeze导出的是当前虚拟环境里所有包包括那些间接依赖。有时候你只是安装了一个requests它会帮你装上urllib3、certifi、charset-normalizer等依赖这些都会被导出来。好处是完整坏处是别人安装时可能因为版本冲突报错。更精确的做法是手动维护一个“直接依赖清单”或者用pipreqs工具根据代码里的import语句自动生成pip install pipreqs pipreqs ./ --force这个工具会扫描你项目源码里的import语句只生成直接依赖干净很多。但它也有局限性比如动态导入或者使用了配置文件中的依赖名称时可能漏掉。我的习惯是对于小项目和快速原型用pip freeze一把梭对于正式项目和需要长期维护的代码库用pipreqs生成初始清单再手动补充特殊依赖和版本约束。5.2 无网络环境下的虚拟环境迁移我在热搜词里看到“使用uv 无网络电脑搭建python开发虚拟环境”这个描述这里展开聊一下我的实践思路。离线搭建虚拟环境本质上是解决“在没有互联网的机器上如何把需要的依赖装进去”这个问题。有三条路可以走。第一条路在联网机器上把包下载下来拷贝到离线机器上安装。在联网机器上执行pip download -r requirements.txt -d ./packages这会把requirements.txt里所有依赖及其间接依赖的whl文件全部下载到packages目录。然后把整个目录拷贝到离线机器上在那个机器的虚拟环境中执行pip install --no-index --find-links./packages -r requirements.txt--no-index告诉pip不要联网去PyPI查--find-links指定本地目录作为包的来源。这个方案适合PyPI上存在同名同版本wheel包的场景。第二条路把别人的虚拟环境整个拷过来。在联网机器上创建好虚拟环境、装好所有依赖直接把整个venv目录压缩拷贝到离线机器上解压。但这种方式有兼容性风险如果两台机器的操作系统、Python版本不一致很可能跑不起来。它只适合完全同平台、同架构的紧急场景复用。第三条路使用uv这个新的Rust实现的包管理器。uv比pip更快对虚拟环境管理也做了很多简化在没有网络的电脑上它的用法与pip类似都需要先把包下载为离线缓存。uv的离线用法是在有网机器上执行uv pip download -r requirements.txt -d ./packages然后把packages目录拷走离线机器上执行uv pip install --no-index --find-links ./packages -r requirements.txt。路径原理和pip一样只是它快很多。说实话离线场景下没有银弹核心思路就是提前把依赖烘焙好随环境一起带走。你只要牢牢记住“依赖文件 本地包目录 --no-index”这三件套就能应对绝大多数离线搭建需求。5.3 Anaconda与venv怎么共存Anaconda是很多数据科学爱好者的标配它自带conda命令可以创建conda虚拟环境。那问题来了有了conda还需要venv吗我的观点是看场景。如果你做的是传统Web开发、接口开发、自动化脚本venv就够用而且和PyCharm、VS Code的集成体验都很好。如果你做的数据分析、机器学习项目并且依赖大量科学计算包numpy、pandas、scipy、pytorch等conda的包管理器在解决二进制依赖上有明显优势它能处理很多pip装不上的底层库。两者共存很简单因为conda环境默认在它自己的envs目录下和venv的项目内目录不冲突。你可以在同一个项目里只用conda环境也可以在同一个机器上同时维护conda环境和venv环境只要确保当前激活的是你想要的环境即可。如果你在PyCharm里要用conda环境新建项目时选择Conda Environment然后选择New environment或Existing environmentPyCharm会自动调用conda的Python解释器。这在实际使用中也很流畅。5.4 虚拟环境迁移时最容易忽略的Python版本问题虚拟环境隔离的是第三方库但并没有完全隔离Python解释器版本。你用Python 3.11创建的venv换到另一台只装了Python 3.9的机器上把venv整个拷过去大概率会报错因为虚拟环境里的pyvenv.cfg还指向3.11。这就是为什么不要直接拷贝整个venv目录到另一台机器。正确的做法是在新机器上先安装和原机器相同的Python版本然后创建新的venv再执行pip install -r requirements.txt。如果版本有差异还可能出现某个包在旧版本Python下没有对应的wheel包被迫走源码编译而编译又缺依赖的情况。所以团队协作时我建议在项目的README里明确写好Python版本要求或者用.python-version文件配合pyenv/uvx这样的工具来锁定版本。5.5 定时清理“僵尸”虚拟环境这个坑可能很多人没遇到过但一旦遇到就很头疼。你日常工作一段时间后系统里可能积累了十几个甚至几十个虚拟环境分布在不同的项目目录里。当你想清理一块磁盘空间时却不知道哪些虚拟环境还在用。我的做法是在项目根目录下建一个.gitignore文件把venv目录写进去保证它不会被提交到代码仓库。然后每隔一段时间用磁盘分析工具Windows下可以用WizTree或TreeSize扫描项目目录看看哪些项目的venv特别大再结合你最近是否还在用这些项目来判断是否删除。另外如果你用PyCharm打开项目时找不到解释器它可以自动扫描该项目的venv目录。如果你把venv目录删了PyCharm下次打开时会提示你重新配置解释器这时只要在项目里重新执行python -m venv venv创建一次再安装依赖就又是一条好汉。6. 常见问题速查与实操心得6.1 常见问题速查表问题表现根本原因最快解决方案pip不是内部或外部命令PATH未配置或Python安装不完整手动配置Scripts目录到PATHPyCharm里运行代码找不到已安装的包解释器指向了错误环境在Settings里重新选择虚拟环境安装包极慢或超时访问PyPI官方源速度慢改用清华源或阿里源两个项目依赖版本冲突共用了同一个全局环境各自创建venv分别安装依赖venv目录拷贝到别的机器后无法运行Python版本或平台不兼容不要拷贝venv在新机器重建并装依赖PowerShell无法激活脚本执行策略限制以当前用户身份设置执行策略为RemoteSigned导入包时ModuleNotFoundError当前环境没装这个包确认激活了正确的虚拟环境再安装6.2 我反复踩过的三个坑第一个坑是刚接触虚拟环境时我把venv目录提交到了Git仓库。那时候觉得“这个环境是我辛苦配好的传到仓库里同事拉下来就能用多方便”。结果整个仓库变得非常大而且同事的电脑操作系统不同venv路径和依赖完全不兼容反而把项目搞乱了。后来才明白依赖信息全部体现在requirements.txt里环境本身是不该提交的。第二个坑是“装包装错环境”。有时候开着PyCharm里面的Terminal确实带(venv)前缀但我手贱去CMD窗口里执行了pip install结果装的全局环境。第二天项目一跑照样报ModuleNotFoundError当时还没反应过来是环境问题花了不少时间排查。后来我每次执行pip安装前都会下意识看一眼当前命令行有没有(venv)前缀或者在PyCharm的Terminal里操作。第三个坑是依赖版本冲突。有一个老项目当时用的是Django 2.2我一个新项目用Django 4.2当时图省事共用全局环境结果两边都出问题。后来我老老实实给每个项目建独立venv按项目锁版本世界瞬间清净了。虚拟环境不是“可选项”而是“必选项”从第一个项目开始就养成用它的习惯后面会少走很多弯路。6.3 个人习惯目录结构的最佳实践我推荐的项目目录结构是这样的my_project/ ├── .venv/ # 虚拟环境目录不提交Git ├── src/ # 源代码 ├── tests/ # 测试代码 ├── requirements.txt # 依赖清单 ├── requirements-dev.txt # 开发环境专属依赖如pytest等 ├── .gitignore # 忽略venv、__pycache__等 └── README.md其中.gitignore至少包含这几行venv/ .venv/ __pycache__/ *.pyc .idea/ .vscode/这种结构的核心思路是“源代码与运行环境分离”。任何人拿到这个仓库只需要安装对应版本的Python创建venv然后执行pip install -r requirements.txt就能跑起来。整个过程不依赖某个特定电脑的特殊配置也不依赖某个IDE的私有设置真正做到开箱即用。6.4 最后再分享一个小技巧当你创建一个新项目时与其先写代码再补环境不如先把环境搭好。具体流程是创建项目目录创建venv创建requirements.txt装上第一批依赖写一个最小可运行的hello.py验证环境无误然后再开始写正式代码。这看起来多花了几分钟但能保证你在开发过程中遇到的所有“找不到包”“版本对不上”等问题都是在这个干净底座上发生的排查起来很轻松。如果你先把代码写了一堆再回头配环境一旦出问题连错误到底来自代码还是环境都分不清。另外如果你用的是VS Code而不是PyCharm记得安装Python扩展后通过命令面板执行“Python: Select Interpreter”把解释器指向你项目里的venv路径。VS Code不像PyCharm那样自动探索项目里的虚拟环境这一步手动选择是很多程序员漏掉的。我相信读到这里你应该已经对“Python虚拟环境 pip PyCharm”这套组合拳有了完整的认知。环境管理是Python开发的基本功也是从“会写脚本”走向“能交付项目”的关键一步。把这套流程内化成自己的肌肉记忆以后不管接手新项目、迁移旧项目还是带新人都会非常顺畅。
返回列表