Skip to content

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
pipPython 官方自带的"包管理器",相当于手机上的"应用商店",负责安装/卸载包
激活(Activate)告诉命令行:"从现在开始,我用的是这个房间里的 Python",进入这个房间
退出(Deactivate)走出房间,回到系统全局环境
requirements.txt一份"购物清单",记录项目需要的所有包及版本,方便别人一键复现你的环境

本指南会手把手带你掌握两个最主流的工具:

  • venv:Python 官方自带,无需额外安装,轻量、够用,适合绝大多数场景;
  • conda:第三方工具,不仅能管 Python 包,还能管 Python 版本和非 Python 的软件,数据科学领域用得最多。

最后还会讲到依赖管理(requirements.txt)、常见报错排查和新手高频问题。即使你完全零基础,跟着做也能顺利完成。


一、准备工作:确认 Python 已安装 ​

虚拟环境是建立在 Python 之上的,所以先确认电脑里装好了 Python。

Windows:按 Win + R,输入 cmd 回车打开命令行(俗称"终端"、"控制台"),输入:

bash
python --version

macOS / Linux:打开"终端"(Terminal),输入:

bash
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",切换文件夹):

bash
# Windows 示例
cd D:\projects\myproject

# macOS/Linux 示例
cd ~/projects/myproject

第 2 步:执行创建命令:

bash
# 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 命令提示符):

bash
venv\Scripts\activate

Windows(PowerShell):

bash
venv\Scripts\Activate.ps1

PowerShell 首次执行可能报红色错误,别慌,这是系统安全策略拦截,解决办法见"常见报错排查"一节。

macOS / Linux:

bash
source venv/bin/activate

source 的意思是"执行这个脚本并让它影响当前终端"。Windows 路径用反斜杠 \,macOS/Linux 用正斜杠 /,注意别写反。

如何判断激活成功? 看命令行最前面是否出现了环境名提示:

bash
(venv) D:\projects\myproject>

括号里的 (venv) 就是标志,表示你现在已经在"房间"里了。也可以用下面命令验证当前用的是哪个 Python:

bash
# Windows
where python

# macOS / Linux
which python

显示的路径里如果包含 venv,说明确认无误。

2.3 在虚拟环境中安装包 ​

激活之后,一切 pip install 都只作用于当前环境,不会污染系统全局:

bash
pip install requests
pip install django==4.2
pip install requests django flask    # 一次装多个

查看当前环境里已安装了哪些包:

bash
pip list

2.4 退出虚拟环境 ​

想"走出房间",一个命令即可(三大系统通用):

bash
deactivate

执行后命令行前面的 (venv) 消失,表示回到了系统全局环境。

2.5 删除虚拟环境 ​

venv 创建的虚拟环境本质就是一个普通文件夹,删除 = 直接删掉那个文件夹:

  1. 先 deactivate 退出环境(如果在里面的话);
  2. 删除文件夹:
bash
# Windows
rmdir /s /q venv

# macOS / Linux
rm -rf venv

也可以在文件管理器里右键删除。删了之后项目代码不受影响,随时可以重新创建环境。

2.6 venv 日常操作流程小结 ​

bash
# 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 相比:

对比项venvconda
来源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 创建虚拟环境 ​

bash
# 创建名为 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 激活环境 ​

bash
conda activate myenv

三大系统命令统一,激活后命令行前缀变成 (myenv)。

3.5 在 conda 环境中安装包 ​

bash
# 方式一:用 conda 自己的仓库安装(推荐先尝试)
conda install numpy

# 方式二:conda 仓库没有的包,可以用 pip 装
pip install requests

查看已安装的包:conda list

3.6 退出环境 ​

bash
conda deactivate

3.7 删除环境 ​

conda 环境不能用"删文件夹"的方式粗暴删除(它登记在 conda 的管理名单里),要用官方命令:

bash
# 先退出该环境,再删除
conda deactivate
conda remove -n myenv --all

--all 表示把这个环境连同里面的所有包一起删除。

3.8 查看所有 conda 环境 ​

bash
conda env list

会列出所有环境及其路径,当前激活的环境前面有 * 号。

3.9 该选 venv 还是 conda? ​

一句话建议:

  • 做 Web 开发、脚本工具、普通项目 → 用 venv,官方自带、轻量、够用;
  • 做数据分析、机器学习、需要切换 Python 版本 → 用 conda,省心省力。

两者不冲突,可以共存于一台电脑。


四、requirements.txt:项目的"购物清单" ​

4.1 它解决什么问题? ​

假设你的项目用了 requests、django 等 5 个包。同事拿到你的代码后,怎么知道要装哪些包、装哪个版本?一个个口头告诉他?太低效。

requirements.txt 就是解决这个问题的标准做法:一份纯文本清单,记录项目所有依赖包及其版本,别人拿到后一条命令就能复现出一模一样的环境。

4.2 生成清单 ​

先激活虚拟环境,然后执行:

bash
pip freeze > requirements.txt

命令解读:pip freeze 会列出当前环境所有包及精确版本;> 是"重定向"符号,表示把输出结果写进后面的文件里(而不是显示在屏幕上)。

生成的 requirements.txt 内容长这样:

text
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 后:

bash
# 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 更新清单 ​

项目开发中又装了新包?重新执行一次生成命令即可,它会覆盖旧文件:

bash
pip freeze > requirements.txt

4.5 conda 环境怎么办? ​

conda 有自己的清单格式(environment.yml),生成和使用:

bash
# 导出
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,执行:

bash
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

输入 Y 确认。这条命令的意思是"允许当前用户运行本地脚本",安全且只影响你自己。设置一次永久生效。之后再执行 venv\Scripts\Activate.ps1 即可。

报错 3:激活后 pip install 仍然装到了全局 ​

原因:激活没成功,或终端里有多个 Python 环境混乱。

排查:

  1. 看命令行前有没有 (venv) 前缀;
  2. 执行 where python(Windows)或 which python(macOS/Linux),确认路径指向虚拟环境目录;
  3. 稳妥写法是用 python -m pip install 包名——python -m pip 表示"用当前这个 python 自带的 pip 来装",能 100% 避免 pip 和 python 不配套的混乱。

报错 4:pip install 下载极慢或超时 ​

原因:pip 默认从国外服务器下载,国内网络不稳定。

解决:换国内镜像源(镜像 = 国内的"分仓库",内容一样但速度快):

bash
# 临时使用清华镜像(单次安装)
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 版本不匹配。

解决:

  1. 先升级 pip 再试:python -m pip install --upgrade pip;
  2. 换一个该包的版本试试:pip install 包名==旧一点的版本号;
  3. 如果是数据科学类包(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:怎么查看某个环境里到底装了哪个版本的包?

bash
pip list                 # 列出所有包及版本
pip show requests        # 查看某个包的详细信息

Q9:退出虚拟环境后,我装的包还在吗?

在。包是存在虚拟环境文件夹里的,deactivate 只是"走出房间",房间里的东西原封不动。下次重新激活就能继续用。

Q10:requirements.txt 里的 == 太严格了,能写成"大于某版本"吗?

可以。支持 >=(大于等于)、~=(兼容版本)等写法,例如 requests>=2.31。但新手阶段建议保持 pip freeze 生成的 == 精确版本,复现环境最稳定。


结语 ​

回顾一下本篇的核心脉络:

  1. 为什么用:虚拟环境 = 每个项目的"独立小房间",隔离依赖,杜绝冲突;
  2. 怎么用 venv:python -m venv venv 创建 → 激活 → pip install 装包 → deactivate 退出 → 删文件夹即删除;
  3. 怎么用 conda:conda create -n 名字 python=版本 创建 → conda activate 激活 → conda deactivate 退出 → conda remove -n 名字 --all 删除,还能自由切换 Python 版本;
  4. 怎么管依赖:pip freeze > requirements.txt 生成清单,pip install -r requirements.txt 一键复现。

虚拟环境是 Python 开发的"第一天必修课",练上三五次就会变成肌肉记忆。现在就去为自己的项目创建第一个虚拟环境吧。