Python 虚拟环境底层原理与 Pycharm Anaconda 实战指南
Python 虚拟环境用于隔离项目依赖,避免包冲突。venv 基于全局解释器轻量隔离,conda 独立管理版本与系统库。本文详解全局环境与虚拟环境实现逻辑,对比 pip 与 conda 工具差异,演示终端、PyCharm 及 Anaconda 创建方法,并说明如何在 Jupyter Notebook 中注册自定义内核。

Python 虚拟环境用于隔离项目依赖,避免包冲突。venv 基于全局解释器轻量隔离,conda 独立管理版本与系统库。本文详解全局环境与虚拟环境实现逻辑,对比 pip 与 conda 工具差异,演示终端、PyCharm 及 Anaconda 创建方法,并说明如何在 Jupyter Notebook 中注册自定义内核。

想要了解 Python 虚拟环境,就必须先了解与之相对的—— Python 全局环境,它是实现虚拟环境的基础。
Python 全局环境其实就是指我们下载安装的 Python。(我们下载安装 Python 本质上就是在安装 Python 环境)
那么我们下载的这个 Python 环境都包含什么呢?如下:
其实就是一个 Python312(或 Python38/39,取决于版本号)文件夹,里面包括:
Python312/
├── Lib/
│ ├── site-packages/ 存放下载的第三方包(下载后才能 import 的)
│ └── python 标准库(可直接 import 的)
├── Scripts/
│ └── pip.exe(python 自带的工具)
├── python.exe:python 解释器(核心部分)
└── [其他必要文件夹]
如果你对你电脑上的 python 环境感到混乱,那让我们从最基础的开始梳理——首先看看我们自己的电脑有哪些 python 全局环境。
我们可以通过查看电脑上有哪些 python 解释器(python.exe)的方式,来确定我们电脑上有几个 python 全局环境。
打开 CMD 输入
where python
会输出本地电脑环境变量中所有的 python 解释器路径。
示例:
C:\Anaconda3\python.exe
C:\Scoop\apps\python\current\python.exe
C:\Users\75224\AppData\Local\Programs\Python\Python312\python.exe
C:\Users\75224\AppData\Local\Microsoft\WindowsApps\python.exe
这些解释器路径来自于你曾经添加到系统或用户环境变量 Path 里的含 python.exe 的路径。
① C:\Anaconda3\python.exe
来自:Anaconda 安装
② C:\Scoop\apps\python\current\python.exe
来自:以前用 Scoop 装过 Python Scoop 是 Windows 的包管理器(类似 apt / brew) 我的这个 Python 现在基本闲置
③ Python312\python.exe
来自:Python 官网安装包,版本:Python 3.12 这是最标准的系统 Python,我的 Pycharm 基础解释器就用的这个 虚拟环境一般推荐:用它 + venv
④ WindowsApps\python.exe
❌ 这个不是真正的 Python,是微软商店的占位符 作用是你没装 Python 时,输入 python → 引导你去 Microsoft Store 安装这个可以无视,甚至建议关掉。
电脑现在默认使用的是刚刚输出的路径中排在第一个的解释器(从刚刚的输出看,我的电脑用的是 Anaconda 的 python 解释器)
那么,是什么决定的电脑优先使用哪个 python 解释器?
答案是—— python 解释器路径在环境变量 Path 中的顺序。而且,Windows 在查找可执行文件时,系统 Path 的优先级高于用户 Path,也就是说你存在系统 Path 里的解释器会被优先调用。
有关 python 虚拟环境的词一大堆:Anaconda、conda、Virtualenv、venv、pip、poetry、Miniconda、base 环境……
这里来逐一解释一下其概念和关系。
pip 是 Python 自带的包管理器。pip 从 PyPI(Python 官方第三方库)下载包,把包安装到当前 Python 环境的 site-packages,并记录版本信息,供 import 使用。
pip 是 Python 官方随解释器一起提供的工具,Python 3.4+内置,默认已安装,无需额外安装。(其实就是 Scripts 文件夹下的 pip.exe )
pip 使用方法就是在终端执行 pip install 包名 (不可以在 py 文件里写 pip 哦,python 解释器看不懂,pip 是和解释器平级的一个工具)
当然,也可以在 Pycharm 上可视化地下载包:
我们都知道,虚拟环境就是为了在不同项目中用不同或不同版本的包的。既然要安装特定版本的包,不就自然要用到 pip 了吗。
一句话:虚拟环境决定'装到哪',而 pip 负责'装什么'
其实 conda 也是包管理工具,也可以像 pip 一样安装包。而且 conda 不仅可以管理包,还能管理 python 解释器本身版本(不同虚拟环境可以用不同 python 版本)。而一个 pip 仅对应一个 python 解释器,因此使用 venv 创建的虚拟环境只能使用该所属 python 解释器的版本的 python。 放心,这些后面都会讲到。
首先明确:pip 是下载 python 时自带的,一个 pip 仅对应一个 Python 解释器(绑定的),pip 会把包安装到它所属的 python 解释器的 site-packages 目录下。
这里有些同学会疑问:既然你说 pip 是安装到它所属的 python 解释器下的,那怎么在特定虚拟环境下 pip 安装包? 这就涉及到虚拟环境的实现逻辑了,答案是,我们可以先激活特定环境,然后 pip 就会自动指向虚拟环境内的 Python,包会安装到虚拟环境的独立目录 site-package 中,不会影响系统 Python。这个之后会细讲的。
想要看我们 python 解释器有哪些包可以从直接打开 site-packages 文件夹(在 python.exe 所在目录下的 Lib\site-packages\)查看,如果你的这个 python 解释器是 Pycharm 的基础解释器,也可以通过 Pycharm 查看。
基础环境最好只装必要的包,越干净越好。
虚拟环境的实现工具其实我们打开 Pycharm 的新建项目就可以看到:
有 Virtualenv(venv)、Pipenv、Poetry、Conda 这四种,它们都是 Python 虚拟环境管理工具。
virtualenv 是 venv 的前身,而 PyCharm 界面显示 " virtualenv ",但实际用的是 Python 标准库的 venv。这只是个命名习惯,不影响使用。对普通用户来说,区分 venv 和 virtualenv 意义不大,所以这里不细讲。
一般学习或编程用 venv,科研 (数模/深度学习) 用 conda,正式工程/团队用 Poetry,老项目用 Pipenv。 一般情况下我们只会用到 venv 和 conda,所以我们主要讲这两个。
我们刚刚已经知道了 python 虚拟环境的实现工具(venv 和 conda),那么想要创建虚拟环境,就自然需要下载这些工具。
其中,venv 刚刚已经说过是 Python 3.3+内置,无需额外安装了。
而想要下载使用 conda,我们一般选择直接下载 Anaconda 或 Miniconda
为啥不直接单独下载 conda? conda 本身不是独立程序,而是工具集合(包管理器 + 虚拟环境管理器)它需要Python 解释器 + 一些核心库才能运行,所以不能单独去官网下载 'conda 可执行程序'用。
Anaconda 和 Miniconda 是一个完整的 Python 发行版,不仅包含 conda 还包含 python 解释器等等的其他工具。
Anaconda
├── conda(核心:包管理器 + 虚拟环境管理器)
├── Python 解释器
├── 预装的常用包(NumPy、Pandas、Matplotlib 等 250+ 个)
├── Jupyter Notebook
├── Spyder IDE
└── Anaconda Navigator(图形界面)
Miniconda
├── conda(核心:包管理器 + 虚拟环境管理器)
├── Python 解释器
└── 基础运行组件(pip、setuptools、wheel 等)
venv 会在指定位置(一般是项目文件夹下)创建一个虚拟环境目录(如 myenv),该目录包含:
Python312/
├── Lib/
│ └── site-packages/ 存放下载的第三方包(下载后才能 import 的)
├── Scripts/
│ ├── pip.exe(python 自带的工具)
│ ├── activate.bat(激活虚拟环境脚本)
│ └── python.exe:全局 python.exe 的副本或链接(Windows 上是副本,Linux / macOS 上是链接)
└── pyvenv.cfg 配置文件
python 全局环境文件夹 VS python 虚拟环境文件夹:
通过对比 python 全局环境文件夹和 python 虚拟环境文件夹,我们就可以很好地理解 venv 创建 python 虚拟环境的原理:
通过图中对比,我们可以看到
通过这些不同,venv 所创建的虚拟环境就可以实现:
有些同学可能会有疑问,windows 会完整复制 python.exe,这样的话也不怎么节省空间吧? 这里我要告诉你:无论是全局的 python.exe 还是虚拟环境里的 python.exe,它们本质上都只是一个 '壳子'或者说'启动引导器'。
真正的大脑其实是:python3x.dll:这是 Python 的核心动态链接库(比如 python312.dll)。所有的语法解析、内存管理、对象创建等'硬活'全在这里面。它通常很大(几 MB 到十几 MB)。全局环境有它,虚拟环境没有它。
而 python.exe 是个只有几百 KB 的文件,它的工作极其简单:找到 python3x.dll,把它加载进内存,然后把用户输入的代码传给 DLL 去处理。
虚拟环境实现原理及流程是:
① venv 会创建虚拟环境文件夹
② 启动虚拟环境时:
# 比如原来你的环境变量 path 里是这样的:
C:\Users\75224\AppData\Local\Programs\Python\Python312
C:\Users\75224\AppData\Local\Programs\Python\Python312\Scripts
# 激活脚本 activate.bat 仅会修改下面那个路径
# 修改后的环境变量 path 里的路径:
C:\Users\75224\AppData\Local\Programs\Python\Python312(不变)
C:\Project_PY\BasicLearning\venv\Scripts(改为虚拟环境文件夹的 Scripts 地址)
# ——这样可以简化对环境变量 path 的管理(只改一个)
pyvenv.cfg 配置文件,记录:
home = C:\Users\75224\AppData\Local\Programs\Python\Python312 # 全局 Python 路径
include-system-site-packages = false # 是否让虚拟环境'使用'全局 Python 环境中的 site-packages
version = 3.9.13
实操观察: 我们随便打开一个虚拟环境项目,就可以看到其目录结构中都会存在一个虚拟环境目录(venv):
Lib 文件夹下的 site-packages 存放下载到该虚拟环境下的包(图中虚拟环境只有 pip 包)
conda 会在其管理目录下(默认 ~/anaconda3/envs/ 或 ~/miniconda3/envs/)创建一个完全独立的环境目录,该目录包含:
本质上是创建一个完全自包含的软件栈,不仅隔离 Python 包,还隔离底层依赖库和编译工具链,实现了更彻底的环境隔离。
打开终端。
# 进入项目目录
cd C:\Project_PY\TestProject
# 创建虚拟环境
python -m venv venv
但,我 1.1.3 里面说了,我现在电脑最先调用的 python 解释器是 Anaconda 的 python 解释器,我们一般不用 Anaconda 的 python 解释器创建 venv 环境(就像你一般不用花瓶吃饭一样)
因此,我使用绝对路径创建:
"C:\Users\75224\AppData\Local\Programs\Python\Python312\python.exe" -m venv venv_312
执行完之后,我们的项目文件夹下就会出现虚拟环境目录:
# 激活虚拟环境
venv_312\Scripts\activate
恭喜你成功激活了虚拟环境
激活环境后,可以安装你在该环境需要的包
# 安装第三方包 (venv_312)
C:\Project_PY\TestProject>pip install 包名
# 退出虚拟环境
dedeactivate
如果你用 PyCharm: 打开项目后,右下角通常会显示使用的 Python 环境。(一般会自动使用当前你创建的虚拟环境)
如果显示使用的不是你创建的那个虚拟环境:点击它,选择 "Add New Interpreter" → "Local Interpreter"。找到你的 venv_312 文件夹路径下的 python.exe。
使用 PyCharm 等 IDE 以后,它们就会全自动打理这个环境,就不用使用 activate 等命令了。
工具选择 Virtualenv,基础解释器选择你的虚拟环境要基于的全局 python 环境,下面红色框的两个可选项
include-system-site-packages = false/true ——是否让虚拟环境使用全局 Python 环境中的 site-packages点击创建即可。
如果你的 Pycharm 项目右下角出现了除了【Pycharm 基础解释器】以及【该项目创建的虚拟环境解释器】之外的乱七八糟的解释器,那多半是由于你之前创建虚拟环境项目时勾选了【可用于所有项目】这个可选项,让其他项目也可选它的虚拟环境解释器。
我这里没有多余的 hhh
解决方法:
文件 → 设置 → 项目:xxx → Python 解释器 → 全部显示
选中你在右下角不想看到的解释器,点击 -,即可。
首先打开 Anaconda Prompt 终端
# 创建一个名为 data_analysis,python 解释器版本为 3.10 的新环境
conda create -n data_analysis python=3.10
-n 指环境名称(name)
# 激活 data_analysis 环境
conda activate data_analysis
# 安装数据分析全家桶
conda install pandas numpy matplotlib seaborn scikit-learn
然后在你 Anaconda 文件夹的 envs 目录下就会出现你创建的新环境了!
怎么看某个 conda 环境里有哪些包:
# 不激活环境的方法
conda list -n data_analysis
# 激活环境的方法
conda activate data_analysis
conda list
打开 Anaconda Navigator,点击左侧的 "Environments" 标签页。
创建完成后,你可以在列表中看到新环境,点击右侧的 "Play" 按钮即可激活并使用该环境。
Pycharm 中:文件 → 设置 → 项目:xxx → Python 解释器 → 添加新的 python 解释器
这个我们还是从底层逻辑讲。
关于这里的名词又一大堆:ipython、Jupyter Notebook、Jupyter、ipykernel…… 我们还是一点一点讲。
ipython 是基于 python 解释器之上的增强型交互解释器前端,就是看起来更好看,多了左侧编号啥的。体现在 Jupyter Notebook 里就是这样:
Jupyter 本质上是一个"标准/协议"加上一套实现这个规范的工具集。
Jupyter(平台 / 项目 / 协议集合)
├── Jupyter Notebook(应用:经典网页界面)
├── JupyterLab(新一代界面)
├── Jupyter Server(后台服务)
├── Kernel Protocol(通信协议)
└── 各种 Kernel(Python / R / Julia …)
总的来说就是:
我们下载 Anaconda 后能够打开 Jupyter Notebook
打开方式一:直接点击图标 打开方式二:打开 Anaconda Prompt 输入
jupyter notebook实际上都是打开了 base 环境下载的 Jupyter Notebook
是因为下载 Anaconda 时它就默认在你的 base 环境里安装了 Jupyter(base 环境安装了 1000 多个包,开箱即用式环境)。这时打开 Jupyter Notebook 就是打开了 base 环境下载的 Jupyter Notebook,里面只有基于 base 环境的 ipykernel。
想要让 Jupyter Notebook 使用其他我们创建的虚拟环境有两种方法:
jupyter notebook,就可以使用 Jupyter Notebook 了(但是这个 Jupyter Notebook 也只能使用基于 A 环境的这一个 ipykernel,相当于一个独立于其他任何环境,独属于自己的 Jupyter Notebook )方法二:仅在你的新环境 A 中安装 ipykernel 并注册(ipykernel 依赖于 ipython,所以当你安装 ipykernel 时,它会自动安装 ipython 作为依赖)之后打开 base 的 Jupyter Notebook 就能看到基于 A 环境的这一个 ipykernel,就可以使用和切换这个环境了。
只要你在 环境 A 中安装并注册了 ipykernel,那么任何安装了 Jupyter 的环境(无论是 base 环境,还是环境 B、环境 C),只要它们启动了 Jupyter Notebook,就都能在内核列表中看到并切换到 环境 A。
我们一般选择方法二,因为这样节省空间,切换灵活。
conda activate data_analysis
conda install ipykernel
python -m ipykernel install --user --name data_analysis --display-name "Python 3.10 (DataAnalysis)"
# 通用模板
python -m ipykernel install --user --name [注册 kernel 的名] --display-name "[Jupyter Notebook 的 UI 展示的核心名]"
[注册 kernel 的名] 一般用你创建的虚拟环境的名字[Jupyter Notebook 的 UI 展示的核心名] 随便,看着好看就行然后,我们就可以在 Jupyter Notebook 中看到新的 kernel 了!
至此,Python 虚拟环境的使用讲解完毕。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online