Python 虚拟环境底层原理及 PyCharm/Anaconda 实战指南
深入解析 Python 虚拟环境的底层实现逻辑,区分全局环境与虚拟环境。介绍了 pip、venv、conda 等工具的区别与应用场景。详细演示了通过命令行和 PyCharm 创建 venv 及 conda 环境的方法,并讲解了如何在 Jupyter Notebook 中注册和使用自定义内核。旨在帮助开发者理清环境管理概念,避免依赖冲突,提升开发效率。

深入解析 Python 虚拟环境的底层实现逻辑,区分全局环境与虚拟环境。介绍了 pip、venv、conda 等工具的区别与应用场景。详细演示了通过命令行和 PyCharm 创建 venv 及 conda 环境的方法,并讲解了如何在 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 解释器(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 的路径。
![图片:环境变量 Path 设置]
① 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 里的解释器会被优先调用。
![图片:系统 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 上可视化地下载包:
![图片: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 查看。
![图片:site-packages 目录]
基础环境最好只装必要的包,越干净越好。
虚拟环境的实现工具其实我们打开 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 地址)
# 这也是为什么虚拟环境目录中 python.exe 在 Scripts 文件夹之下
# ——这样可以简化对环境变量 path 的管理(只改一个)
pyvenv.cfg 配置文件,记录:
home = C:\Users\75224\AppData\Local\Programs\Python\Python312
include-system-site-packages = false
version = 3.9.13
实操观察: 我们随便打开一个虚拟环境项目,就可以看到其目录结构中都会存在一个虚拟环境目录(venv):
![图片:虚拟环境目录结构]
Lib 文件夹下的 site-packages 存放下载到该虚拟环境下的包(图中虚拟环境只有 pip 包)
![图片:site-packages 内容]
conda 会在其管理目录下(默认 ~/anaconda3/envs/ 或 ~/miniconda3/envs/)创建一个完全独立的环境目录,该目录包含:
![图片:Conda 环境目录结构]
本质上是创建一个完全自包含的软件栈,不仅隔离 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 目录生成]
# 激活虚拟环境
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 等命令了。
![图片:PyCharm 环境状态栏]
工具选择 Virtualenv,基础解释器选择你的虚拟环境要基于的全局 python 环境,下面红色框的两个可选项
include-system-site-packages = false/true ——是否让虚拟环境使用全局 Python 环境中的 site-packages![图片:PyCharm 新建项目配置]
点击创建即可。
首先打开 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
Pycharm 中:文件 → 设置 → 项目:xxx → Python 解释器 → 添加新的 python 解释器
![图片:PyCharm 添加 Conda 环境]
这个我们还是从底层逻辑讲。
关于这里的名词又一大堆:ipython、Jupyter Notebook、Jupyter、ipykernel…… 我们还是一点一点讲。
ipython 是基于 python 解释器之上的增强型交互解释器前端,就是看起来更好看,多了左侧编号啥的。体现在 Jupyter Notebook 里就是这样:
![图片:IPython 界面]
Jupyter 本质上是一个"标准/协议"加上一套实现这个规范的工具集。
Jupyter(平台 / 项目 / 协议集合)
├── Jupyter Notebook(应用:经典网页界面)
├── JupyterLab(新一代界面)
├── Jupyter Server(后台服务)
├── Kernel Protocol(通信协议)
└── 各种 Kernel(Python / R / Julia …)
总的来说就是:
![图片:Jupyter 架构示意图]
我们下载 Anaconda 后能够打开 Jupyter Notebook。
打开方式一:直接点击图标 打开方式二:打开 Anaconda Prompt 输入
jupyter notebook实际上都是打开了 base 环境下载的 Jupyter Notebook
是因为下载 Anaconda 时它就默认在你的 base 环境里安装了 Jupyter(base 环境安装了 1000 多个包,开箱即用式环境)。这时打开 Jupyter Notebook 就是打开了 base 环境下载的 Jupyter Notebook,里面只有基于 base 环境的 ipykernel。
![图片:Base 环境 Jupyter]
想要让 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 了!
![图片:Jupyter 内核选择]

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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