Python 原始虚拟环境
引言:为什么每个 Python 项目都需要一个"独立小房间"
先想象一个生活场景:你在家做饭,厨房只有一套调料。今天做川菜要放很多辣椒,明天做粤菜要把辣椒全部收起来,后天又做川菜……每次都要重新调整调料架,迟早会乱套。
Python 项目也面临同样的问题:
- 项目 A 用的是 Django 3.2,项目 B 必须用 Django 4.2,而电脑上只能装一个版本;
- 项目 C 依赖某个旧版本的
numpy,升级它会导致项目 D 报错; - 卸载某个包时,不小心把别的项目也在用的包给卸了,牵一发而动全身。
虚拟环境(Virtual Environment)就是为每个项目单独隔出来的"一间独立小房间"。每个房间里有自己专属的 Python 解释器和一套独立的第三方包,房间之间互不干扰。你在 A 房间里升级、删除任何包,都不会影响 B 房间。
几个核心术语的通俗解释:
| 术语 | 通俗解释 |
|---|---|
| 虚拟环境 | 一个独立的目录,里面装着一份"专属于本项目"的 Python 和包,和系统全局环境隔离 |
| 解释器(Interpreter) | 真正执行 Python 代码的那个程序(python.exe),虚拟环境用的是"房间里的副本" |
| 包(Package) | 别人写好的、可以直接拿来用的代码库,比如 requests、numpy |
| pip | Python 官方自带的"包管理器",相当于手机上的"应用商店",负责安装/卸载包 |
| 激活(Activate) | 告诉命令行:"从现在开始,我用的是这个房间里的 Python",进入这个房间 |
| 退出(Deactivate) | 走出房间,回到系统全局环境 |
| requirements.txt | 一份"购物清单",记录项目需要的所有包及版本,方便别人一键复现你的环境 |
本指南会手把手带你掌握两个最主流的工具:
- venv:Python 官方自带,无需额外安装,轻量、够用,适合绝大多数场景;
- conda:第三方工具,不仅能管 Python 包,还能管 Python 版本和非 Python 的软件,数据科学领域用得最多。
最后还会讲到依赖管理(requirements.txt)、常见报错排查和新手高频问题。即使你完全零基础,跟着做也能顺利完成。
一、准备工作:确认 Python 已安装
虚拟环境是建立在 Python 之上的,所以先确认电脑里装好了 Python。
Windows:按 Win + R,输入 cmd 回车打开命令行(俗称"终端"、"控制台"),输入:
python --versionmacOS / Linux:打开"终端"(Terminal),输入:
python3 --version小贴士:macOS 和 Linux 系统自带的命令叫
python3(因为老系统里python指的是 Python 2)。Windows 上通常直接用python。下文命令中 Windows 用python,macOS/Linux 用python3,请注意区分。
如果看到类似 Python 3.12.4 的版本号,说明已安装。如果提示"不是内部或外部命令"或 command not found,请先到 python.org 下载安装(Windows 安装时务必勾选"Add Python to PATH",这相当于告诉系统"记住 python 这个命令在哪里")。
二、venv:Python 官方自带的虚拟环境工具
venv 从 Python 3.3 起内置在标准库里,不用安装任何东西,开箱即用。
2.1 创建虚拟环境
第 1 步:打开命令行,进入你的项目目录(用 cd 命令切换目录,cd 即 "change directory",切换文件夹):
# Windows 示例
cd D:\projects\myproject
# macOS/Linux 示例
cd ~/projects/myproject第 2 步:执行创建命令:
# Windows
python -m venv venv
# macOS / Linux
python3 -m venv venv命令解读:python -m venv venv 的意思是"用 python 运行 venv 这个模块(-m 表示把模块当命令执行),创建一个名叫 venv 的虚拟环境"。
命名说明:最后一个
venv是文件夹的名字,可以改成任何你喜欢的名字(比如.venv、env)。社区习惯用venv或.venv,一眼就能认出这是虚拟环境目录。
执行后,项目目录下会多出一个 venv 文件夹,里面就是这个"小房间"的全套设施:独立的 Python 解释器、pip、以及将来要装的包。
2.2 激活虚拟环境
创建好房间后,要"走进去"才能用。激活命令因操作系统而异:
Windows(CMD 命令提示符):
venv\Scripts\activateWindows(PowerShell):
venv\Scripts\Activate.ps1PowerShell 首次执行可能报红色错误,别慌,这是系统安全策略拦截,解决办法见"常见报错排查"一节。
macOS / Linux:
source venv/bin/activate
source的意思是"执行这个脚本并让它影响当前终端"。Windows 路径用反斜杠\,macOS/Linux 用正斜杠/,注意别写反。
如何判断激活成功? 看命令行最前面是否出现了环境名提示:
(venv) D:\projects\myproject>括号里的 (venv) 就是标志,表示你现在已经在"房间"里了。也可以用下面命令验证当前用的是哪个 Python:
# Windows
where python
# macOS / Linux
which python显示的路径里如果包含 venv,说明确认无误。
2.3 在虚拟环境中安装包
激活之后,一切 pip install 都只作用于当前环境,不会污染系统全局:
pip install requests
pip install django==4.2
pip install requests django flask # 一次装多个查看当前环境里已安装了哪些包:
pip list2.4 退出虚拟环境
想"走出房间",一个命令即可(三大系统通用):
deactivate执行后命令行前面的 (venv) 消失,表示回到了系统全局环境。
2.5 删除虚拟环境
venv 创建的虚拟环境本质就是一个普通文件夹,删除 = 直接删掉那个文件夹:
- 先
deactivate退出环境(如果在里面的话); - 删除文件夹:
# Windows
rmdir /s /q venv
# macOS / Linux
rm -rf venv也可以在文件管理器里右键删除。删了之后项目代码不受影响,随时可以重新创建环境。
2.6 venv 日常操作流程小结
# 1. 创建(只做一次)
python -m venv venv
# 2. 激活(每次开始干活前)
venv\Scripts\activate # Windows
source venv/bin/activate # macOS/Linux
# 3. 装包、写代码、跑程序
pip install requests
python my_script.py
# 4. 退出(干完活后)
deactivate三、conda:功能更强大的环境管理工具
3.1 conda 是什么?和 venv 有什么区别?
conda 是一个第三方的环境和包管理工具。和 venv 相比:
| 对比项 | venv | conda |
|---|---|---|
| 来源 | Python 官方自带 | 需要安装 Anaconda 或 Miniconda |
| 能否切换 Python 版本 | 不能(用什么 Python 创建就是什么版本) | 能,一条命令装任意版本 |
| 能装什么 | 只装 Python 包 | Python 包 + 其他语言的库(如 CUDA、ffmpeg) |
| 体积 | 轻量 | 较大 |
| 典型用户 | 通用开发、Web 开发 | 数据科学、机器学习 |
通俗类比:venv 是"精装单间",够住够用;conda 是"全屋定制的公寓",连地基(Python 版本本身)都能换。
Anaconda 与 Miniconda:Anaconda 是"全家桶",自带几百个数据科学包,体积 3GB+;Miniconda 是"精简版",只带 conda 本身,按需安装。新手推荐 Miniconda,下载地址:https://docs.conda.io/en/latest/miniconda.html。
3.2 安装 conda
- Windows:下载 Miniconda 的
.exe安装包,双击一路下一步(建议勾选"Add Miniconda to PATH"或直接使用安装后自带的 "Anaconda Prompt"); - macOS:下载
.pkg或.sh安装包安装,M 系列芯片选 arm64 版本; - Linux:下载
.sh脚本,终端执行bash Miniconda3-latest-Linux-x86_64.sh,按提示回车确认。
安装完成后打开新的终端,输入 conda --version,看到版本号即成功。
安装后终端命令行前可能出现
(base)字样,这是 conda 的默认环境自动激活了,属正常现象,不用管。
3.3 创建虚拟环境
# 创建名为 myenv、Python 版本为 3.11 的环境
conda create -n myenv python=3.11-n myenv:指定环境名称(name 的缩写);python=3.11:指定 Python 版本——这是 conda 独有的优势,即使电脑上没装 3.11,conda 也会自动下载。
中途会问 Proceed ([y]/n)?,输入 y 回车即可。
3.4 激活环境
conda activate myenv三大系统命令统一,激活后命令行前缀变成 (myenv)。
3.5 在 conda 环境中安装包
# 方式一:用 conda 自己的仓库安装(推荐先尝试)
conda install numpy
# 方式二:conda 仓库没有的包,可以用 pip 装
pip install requests查看已安装的包:conda list
3.6 退出环境
conda deactivate3.7 删除环境
conda 环境不能用"删文件夹"的方式粗暴删除(它登记在 conda 的管理名单里),要用官方命令:
# 先退出该环境,再删除
conda deactivate
conda remove -n myenv --all--all 表示把这个环境连同里面的所有包一起删除。
3.8 查看所有 conda 环境
conda env list会列出所有环境及其路径,当前激活的环境前面有 * 号。
3.9 该选 venv 还是 conda?
一句话建议:
- 做 Web 开发、脚本工具、普通项目 → 用 venv,官方自带、轻量、够用;
- 做数据分析、机器学习、需要切换 Python 版本 → 用 conda,省心省力。
两者不冲突,可以共存于一台电脑。
四、requirements.txt:项目的"购物清单"
4.1 它解决什么问题?
假设你的项目用了 requests、django 等 5 个包。同事拿到你的代码后,怎么知道要装哪些包、装哪个版本?一个个口头告诉他?太低效。
requirements.txt 就是解决这个问题的标准做法:一份纯文本清单,记录项目所有依赖包及其版本,别人拿到后一条命令就能复现出一模一样的环境。
4.2 生成清单
先激活虚拟环境,然后执行:
pip freeze > requirements.txt命令解读:pip freeze 会列出当前环境所有包及精确版本;> 是"重定向"符号,表示把输出结果写进后面的文件里(而不是显示在屏幕上)。
生成的 requirements.txt 内容长这样:
certifi==2024.2.2
charset-normalizer==3.3.2
Django==4.2.11
idna==3.6
requests==2.31.0
urllib3==2.2.1每一行都是 包名==版本号 的格式,== 表示"精确等于这个版本"。
注意:务必在激活虚拟环境后再执行
pip freeze,否则会把系统全局环境的包也写进去,清单就不"干净"了。
4.3 根据清单一键安装
别人(或换了一台电脑的你)拿到代码和 requirements.txt 后:
# 1. 创建并激活一个新虚拟环境(前面教过的步骤)
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # macOS/Linux
# 2. 一键安装清单里的所有包
pip install -r requirements.txt-r 是 "requirement" 的缩写,表示"按这份清单逐个安装"。执行完,对方的环境就和你的完全一样了。
4.4 更新清单
项目开发中又装了新包?重新执行一次生成命令即可,它会覆盖旧文件:
pip freeze > requirements.txt4.5 conda 环境怎么办?
conda 有自己的清单格式(environment.yml),生成和使用:
# 导出
conda env export > environment.yml
# 根据文件创建环境
conda env create -f environment.yml不过 conda 环境同样支持 pip freeze + pip install -r 的玩法,两者皆可。
五、常见报错排查与解决方案
报错 1:'python' 不是内部或外部命令 / command not found: python
原因:系统找不到 python 命令,通常是 Python 没装,或安装时没加入 PATH 环境变量(PATH 是系统的"通讯录",记录着去哪里找各个命令)。
解决:
- Windows:重新运行 Python 安装包,勾选 Add Python to PATH 后再安装;或尝试用
py命令代替python; - macOS/Linux:用
python3代替python。
报错 2:PowerShell 激活时报红 无法加载文件 Activate.ps1,因为在此系统上禁止运行脚本
原因:PowerShell 默认的安全策略(执行策略)禁止运行脚本,防止恶意脚本。
解决:以管理员身份打开 PowerShell,执行:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser输入 Y 确认。这条命令的意思是"允许当前用户运行本地脚本",安全且只影响你自己。设置一次永久生效。之后再执行 venv\Scripts\Activate.ps1 即可。
报错 3:激活后 pip install 仍然装到了全局
原因:激活没成功,或终端里有多个 Python 环境混乱。
排查:
- 看命令行前有没有
(venv)前缀; - 执行
where python(Windows)或which python(macOS/Linux),确认路径指向虚拟环境目录; - 稳妥写法是用
python -m pip install 包名——python -m pip表示"用当前这个 python 自带的 pip 来装",能 100% 避免 pip 和 python 不配套的混乱。
报错 4:pip install 下载极慢或超时
原因:pip 默认从国外服务器下载,国内网络不稳定。
解决:换国内镜像源(镜像 = 国内的"分仓库",内容一样但速度快):
# 临时使用清华镜像(单次安装)
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
# 永久配置(推荐,执行一次即可)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple报错 5:ERROR: Could not build wheels for xxx 或编译类报错
原因:某些包需要从源代码编译,电脑缺少编译工具;或包版本与 Python 版本不匹配。
解决:
- 先升级 pip 再试:
python -m pip install --upgrade pip; - 换一个该包的版本试试:
pip install 包名==旧一点的版本号; - 如果是数据科学类包(numpy、pandas 等),直接用 conda 安装可以避开编译:
conda install numpy。
报错 6:conda 命令找不到
原因:conda 没加入 PATH,或安装后没重启终端。
解决:
- 先关闭所有终端窗口再重开试试;
- Windows 用户可直接使用开始菜单里的 Anaconda Prompt(它自带配置好的环境);
- Linux/macOS 可执行
~/miniconda3/bin/conda init然后重开终端。
六、新手高频问题 FAQ
Q1:每个项目都要建一个虚拟环境吗?
建议是的。环境创建的代价极低(几秒钟),但能彻底避免包版本冲突。宁可多建,不要共用。
Q2:虚拟环境文件夹(venv)要上传到 Git 仓库吗?
不要。它体积大且与操作系统绑定,别人拿到也用不了。正确做法是:上传 requirements.txt,让别人自己创建环境。记得在 .gitignore 文件里加一行 venv/(.gitignore 是告诉 Git"哪些文件不用管"的配置文件)。
Q3:我把项目文件夹移动了位置,虚拟环境还能用吗?
大概率不能。venv 里记录的是创建时的绝对路径,文件夹挪窝后激活脚本会失效。解决办法:删掉旧的 venv 文件夹,在新位置重新创建环境,再用 pip install -r requirements.txt 恢复依赖。
Q4:激活虚拟环境后,我是不是只能在命令行里跑代码?
不是。VS Code、PyCharm 等编辑器都可以"选择解释器"——在项目里选中 venv 目录下的 Python(Windows 是 venv\Scripts\python.exe,macOS/Linux 是 venv/bin/python),之后编辑器里点"运行"也会自动使用虚拟环境。
Q5:同一个项目能同时用 venv 和 conda 吗?
强烈不建议。混用两套环境管理会让依赖关系变得扑朔迷离。一个项目选一种工具,从一而终。
Q6:虚拟环境会占用很多硬盘空间吗?
每个 venv 环境大约 20~50MB 起步,装了包之后会变大。长时间不用的旧项目环境可以直接删掉(反正有 requirements.txt 随时可以重建),这是清理硬盘的常规操作。
Q7:pip install 和 python -m pip install 有什么区别?
效果基本一样,但后者更保险。它明确指定"用当前这个 Python 的 pip",避免电脑里有多个 Python 时 pip 装错了环境。养成用 python -m pip install 包名 的习惯,可以少踩一半的坑。
Q8:怎么查看某个环境里到底装了哪个版本的包?
pip list # 列出所有包及版本
pip show requests # 查看某个包的详细信息Q9:退出虚拟环境后,我装的包还在吗?
在。包是存在虚拟环境文件夹里的,deactivate 只是"走出房间",房间里的东西原封不动。下次重新激活就能继续用。
Q10:requirements.txt 里的 == 太严格了,能写成"大于某版本"吗?
可以。支持 >=(大于等于)、~=(兼容版本)等写法,例如 requests>=2.31。但新手阶段建议保持 pip freeze 生成的 == 精确版本,复现环境最稳定。
结语
回顾一下本篇的核心脉络:
- 为什么用:虚拟环境 = 每个项目的"独立小房间",隔离依赖,杜绝冲突;
- 怎么用 venv:
python -m venv venv创建 → 激活 →pip install装包 →deactivate退出 → 删文件夹即删除; - 怎么用 conda:
conda create -n 名字 python=版本创建 →conda activate激活 →conda deactivate退出 →conda remove -n 名字 --all删除,还能自由切换 Python 版本; - 怎么管依赖:
pip freeze > requirements.txt生成清单,pip install -r requirements.txt一键复现。
虚拟环境是 Python 开发的"第一天必修课",练上三五次就会变成肌肉记忆。现在就去为自己的项目创建第一个虚拟环境吧。