一篇从底层搞懂 Python 虚拟环境,熟练使用和创建 Python 虚拟环境(实用版:Pycharm、Anaconda)

一篇从底层搞懂 Python 虚拟环境,熟练使用和创建 Python 虚拟环境(实用版:Pycharm、Anaconda)
写本篇的目的是作者虽然理解 Python 虚拟环境的概念,但对于其实现方法和实现逻辑很模糊,特别是一直感觉没搞懂 Pycharm 里的解释器设置逻辑(导致每次新建项目时 Pycharm 里好多 [invalid] 解释器已经乱作一团了…)再加上新下载的 Anaconda,已经傻傻分不清了。。
所以,希望通过这一篇文章来梳理一下虚拟环境的实现逻辑,以及如何合理使用和创建虚拟环境。

1 虚拟环境实现逻辑理解

1.1 Python 全局环境

想要了解 Python 虚拟环境,就必须先了解与之相对的—— Python 全局环境,它是实现虚拟环境的基础。

Python 全局环境其实就是指我们下载安装的 Python ,(我们下载安装 Python 本质上就是在安装 Python 环境)

那么我们下载的这个 Python 环境都包含什么呢?如下:

其实就是一个 Python312(或Python38/39,取决于版本号)文件夹,里面包括:

Python312/ ├── Lib/ │ ├── site-packages/ 存放下载的第三方包(下载后才能 import 的) │ └── python标准库(可直接 import 的) ├── Scripts/ │ └── pip.exe(python自带的工具) ├── python.exe:python解释器(核心部分) └── [其他必要文件夹] 
在这里插入图片描述


在这里插入图片描述

1.1.1 查看 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 的路径。

在这里插入图片描述

1.1.2 解释器来历

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安装这个可以无视,甚至建议关掉。

1.1.3 解释器优先级

电脑现在默认使用的是刚刚输出的路径中排在第一个的解释器(从刚刚的输出看,我的电脑用的是 Anaconda 的 python 解释器)

那么,是什么决定的电脑优先使用哪个 python 解释器?

答案是—— python 解释器路径在环境变量 Path 中的顺序。而且,Windows 在查找可执行文件时,系统 Path 的优先级高于用户 Path,也就是说你存在系统 Path 里的解释器会被优先调用。

在这里插入图片描述
在这里插入图片描述

1.2 虚拟环境词汇理解

有关python虚拟环境的词一大堆:Anaconda、conda、Virtualenv、venv、pip、poetory、Miniconda、base环境……

这里来逐一解释一下其概念和关系。

1.2.1 pip

问题一:pip 是什么?

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 了吗。

一句话:虚拟环境决定“装到哪”,而 pip 负责“装什么”

其实 conda 也是包管理工具,也可以像 pip 一样安装包。而且 conda 不仅可以管理包,还能管理 pythoon 解释器本身版本(不同虚拟环境可以用不同 python版本)。而一个 pip 仅对应一个 python 解释器,因此使用 venv 创建的虚拟环境只能使用该所属 python 解释器的版本的 python。
放心,这些后面都会讲到。
问题三:怎么知道我已经 pip下载了哪些包?

首先明确:pip 是下载 python 时自带的,一个 pip 仅对应一个 Python 解释器(绑定的),pip 会把包安装到它所属的 python 解释器的 site-packages 目录下。

这里有些同学会疑问:既然你说 pip 是安装到它所属的 python 解释器下的,那怎么在特定虚拟环境下 pip 安装包?
这就涉及到虚拟环境的实现逻辑了,答案是,我们可以先激活特定环境,然后 pip 就会自动指向虚拟环境内的 Python,包会安装到虚拟环境的独立目录 site-package 中,不会影响系统 Python。这个之后会细讲的。

想要看我们 python 解释器有哪些包可以从直接打开 site-packages 文件夹(在pythoon.exe所在目录下的Lib\site-packages\)查看,如果你的这个 python 解释器是 Pycharm 的基础解释器,也可以通过 Pycharm 查看。

在这里插入图片描述
在这里插入图片描述


基础环境最好只装必要的包,越干净越好。

1.2.2 虚拟环境工具(venv、conda、pipenv、poetry)

虚拟环境的实现工具其实我们打开 Pycharm 的新建项目就可以看到:

在这里插入图片描述

有Virtualenv(venv)、Pipenv、Poetry、Conda 这四种,它们都是 Python 虚拟环境管理工具。

virtualenv 是 venv 的前身,而 PyCharm 界面显示 " virtualenv ",但实际用的是 Python 标准库的 venv。这只是个命名习惯,不影响使用。对普通用户来说,区分 venv 和 virtualenv 意义不大,所以这里不细讲。
  • venv:官方标准工具,和 pip 一样,Python 3.3+内置,无需额外安装。只负责给每个项目创建一个独立的 Python 环境,简单隔离,不管工程规范。
  • Conda:既能管虚拟环境,又能管 Python 版本和底层系统依赖(包管理器 + 虚拟环境管理器),科研和深度学习首选。
  • Pipenv:在 virtualenv 基础上加了依赖管理和锁文件,试图让项目更规范,但现在用得越来越少。
  • Poetry:集虚拟环境、依赖管理、版本锁定和打包发布于一体的现代 Python 工程工具。
一般学习或编程用 venv,科研 (数模/深度学习) 用 conda,正式工程/团队用 Poetry,老项目用 Pipenv。
一般情况下我们只会用到 venv 和 conda,所以我们主要讲这两个。

1.2.3 Anaconda、Miniconda

我们刚刚已经知道了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 等) 

1.3 虚拟环境实现逻辑【重点】

1.3.1 venv 创建虚拟环境的原理

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 虚拟环境的原理:

通过图中对比,我们可以看到

  • 虚拟环境中 Lib 文件夹下没有了标准库
  • python.exe 放到了 Script 文件夹下,同时 Scripts 文件夹下还多了 activate.bat 激活脚本文件
  • 虚拟环境文件夹下还多了 pyvenv.cfg 配置文件

通过这些不同,venv 所创建的虚拟环境就可以实现:

  • 切换(激活)虚拟环境
  • 节省空间(仅存了python解释器副本或链接)
  • 可以完整使用全局 python 的解释器、标准库和核心 DLL
  • 有自己独立的 site-package 保存下载的第三方包和其他环境隔离
有些同学可能会有疑问,windows 会完整复制 python.exe,这样的话也不怎么节省空间吧?
这里我要告诉你:无论是全局的 python.exe 还是虚拟环境里的 python.exe,它们本质上都只是一个 “壳子”或者说“启动引导器”
_
真正的大脑其实是:python3x.dll:这是 Python 的核心动态链接库(比如 python312.dll)。所有的语法解析、内存管理、对象创建等“硬活”全在这里面。它通常很大(几 MB 到十几 MB)。全局环境有它,虚拟环境没有它。
_
而 python.exe 是个只有几百 KB 的文件,它的工作极其简单:找到 python3x.dll,把它加载进内存,然后把用户输入的代码传给 DLL 去处理。

虚拟环境实现原理及流程是:

① venv 会创建虚拟环境文件夹

② 启动虚拟环境时:

  1. 其中激活脚本 activate.bat 会修改环境变量 path,使系统能找到虚拟环境目录下的 python.exe。
# 比如原来你的环境变量 path 里是这样的: C:\Users\75224\AppData\Local\Programs\Python\Python312 C:\Users\75224\AppData\Local\Programs\Python\Python312\Scrpits # 激活脚本 activate.bat 仅会修改下面那个路径 # 修改后的环境变量 path 里的路径: C:\Users\75224\AppData\Local\Programs\Python\Python312(不变) C:\Project_PY\BasicLearning\venv\Scripts(改为虚拟环境文件夹的 Scripts 地址) # 这也是为什么虚拟环境目录中 python.exe 在 Scripts 文件夹之下 # ——这样可以简化对环境变量 path 的管理(只改一个) 
  1. 于是乎,系统就能顺利找到虚拟环境目录下的 python.exe 并启动。python.exe 会从配置文件 pyvenv.cfg 中读取 home 路径(全局python环境的路径),来使用全局环境中的python3x.dll等文件。
pyvenv.cfg 配置文件,记录: home = C:\Users\75224\AppData\Local\Programs\Python\Python312 # 全局Python路径 include-system-site-packages = false # 是否让虚拟环境“使用”全局 Python 环境中的 site-packages version = 3.9.13 
  1. 当我们在虚拟环境下下载第三方包时,它会独立地保存在我们创建的虚拟环境的 site-package 里,如此一来就实现了虚拟环境的隔离功能。

实操观察:
我们随便打开一个虚拟环境项目,就可以看到其目录结构中都会存在一个虚拟环境目录(venv):

在这里插入图片描述

Lib 文件夹下的 site-packages 存放下载到该虚拟环境下的包(图中虚拟环境只有pip包)

在这里插入图片描述

1.3.2 conda 创建虚拟环境的原理

conda 会在其管理目录下(默认 ~/anaconda3/envs/ 或 ~/miniconda3/envs/)创建一个完全独立的环境目录,该目录包含:

在这里插入图片描述
  • 完整的 python 解释器副本(不是链接),可以是不同版本的 python (因此不同虚拟环境可以使用不同版本的 python 解释器)
  • 独立的库文件和二进制依赖,包括非 Python 的系统库(如 C/C++ 库)
  • 独立的 site-packages 目录,存放该环境的所有包
  • 环境激活脚本,修改多个环境变量(PATH、LD_LIBRARY_PATH 等)实现完整的环境隔离

本质上是创建一个完全自包含的软件栈,不仅隔离 Python 包,还隔离底层依赖库和编译工具链,实现了更彻底的环境隔离。


2 创建/使用虚拟环境

2.1 通过 venv 创建 python 虚拟环境

2.1.1 终端命令行中通过 venv 创建虚拟环境

打开终端。

第一步:进入你的项目目录
# 进入项目目录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 包名 
第五步:退出虚拟环境
# 退出虚拟环境 deactivate 

如果你用 PyCharm:
打开项目后,右下角通常会显示使用的 Python 环境。(一般会自动使用当前你创建的虚拟环境)

如果显示使用的不是你创建的那个虚拟环境:点击它,选择 “Add New Interpreter” → “Local Interpreter”。找到你的 venv_312 文件夹路径下的 python.exe。

使用 PyCharm 等 IDE 以后,它们就会全自动打理这个环境,就不用使用 activate 等命令了。

在这里插入图片描述

2.1.2 Pycharm 中通过 venv 创建虚拟环境【推荐】

仅一步:点击新建项目

工具选择 Virtualenv ,基础解释器选择你的虚拟环境要基于的全局 python 环境,下面红色框的两个可选项

  • 【继承全局站点软件包】:就是之前我说的 pyvenv.cfg 配置文件里的 include-system-site-packages = false/true ——是否让虚拟环境使用全局 Python 环境中的 site-packages
  • 【可用于所有项目】:勾选后,Pycharm 会自己记录这个虚拟环境的绝对路径,其它项目在创建时就可以共用这个虚拟环境了(但如果你把这个项目删除了,它的虚拟环境也就没了,其他项目就不能接着用了)
在这里插入图片描述


点击创建即可。

强迫症如何删除 Pycharm 右下角显示的多个环境?

如果你的 Pycharm 项目右下角出现了除了【Pycharm 基础解释器】以及【该项目创建的虚拟环境解释器】之外的乱七八糟的解释器,那多半是由于你之前创建虚拟环境项目时勾选了【可用于所有项目】这个可选项,让其他项目也可选它的虚拟环境解释器。

我这里没有多余的hhh

在这里插入图片描述

解决方法:

文件 → 设置 → 项目:xxx → Python 解释器 → 全部显示

在这里插入图片描述


选中你在右下角不想看到的解释器,点击 -,即可。

在这里插入图片描述

2.2 通过 conda 创建 python 虚拟环境

2.2.1 Anaconda Prompt 中通过 conda 创建虚拟环境【推荐】

首先打开 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 

2.2.2 Anaconda Navigator 中通过 conda 创建虚拟环境

这个我不想写了,自己搜吧,之后再填坑。。

2.2.3 Pycharm中创建和使用 conda 环境

Pycharm 中:文件 → 设置 → 项目:xxx → Python 解释器 → 添加新的python解释器

在这里插入图片描述

3 在 Jupyter Notebook 中使用 conda 虚拟环境

3.1 Jupyter 的底层逻辑

这个我们还是从底层逻辑讲。

关于这里的名词又一大堆:ipython、Jupyter Notebook、Jupyter、ipykernel…… 我们还是一点一点讲。
  • ipykernel 是 ipython 的 Jupyter 适配层,让 ipython 能作为 Jupyter 的 kernel 运行。

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 使用其他我们创建的虚拟环境有两种方法:

  • 方法一:在你的新环境 A 里安装 Jupyter,之后打开 Anaconda Prompt,激活环境 A,输入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。

我们一般选择方法二,因为这样节省空间,切换灵活。如果想使用方法一就自己问 AI 吧,我懒得搞了。。。

3.2 在 Jupyter Notebook 中使用新建虚拟环境(方法二版)

第一步:激活环境
conda activate data_analisis 
第二步:下载 ipykernel
conda install ipykernel 
第三步:注册:将该环境写入 Jupyter 的内核列表
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 了!

在这里插入图片描述

OK. That’s ALL.


本篇文章中的 python 虚拟环境理解部分有参考 b 站 DavyCloud 的视频(up 讲得很清晰,醍醐灌顶):【安装不算完事,只有理解了虚拟环境才算真正掌握 Python 环境-哔哩哔哩】 https://b23.tv/gECrc5x

Read more

开源强化学习框架RLinf:面向具身和智能体的强化学习基础设施

开源强化学习框架RLinf:面向具身和智能体的强化学习基础设施

清华大学等发布RLinf:面向具身和智能体的强化学习基础设施 RLinf 是一个灵活且可扩展的开源强化学习基础设施,是以清华大学、北京中关村学院、无问芯穹为核心,还联合了北京大学、加州大学伯克利分校等机构共同参与设计并开源。这是一个面向具身智能的“渲训推一体化”大规模强化学习框架,专门为具身人工智能和智能体人工智能而设计。RLinf 中的“inf”代表“基础设施” Infrastructure,突显了它作为下一代训练强大骨干的作用。它也代表“无限” Infinite,象征着该系统支持开放式学习、持续泛化以及智能发展中的无限可能。 RLinf具身智能AI强化学习训练平台框架 参考链接: https://github.com/RLinf/RLinf Franka真机强化学习 本文档给出在 RLinf 框架内启动在 Franka 机械臂真机环境中训练任务的完整指南, 重点介绍如何从零开始训练基于 ResNet 的 CNN 策略以完成机器人操作任务。 主要目标是让模型具备以下能力: 1. 视觉理解:处理来自机器人相机的 RGB 图像。 2.

By Ne0inhk

最近爆火的 OpenClaw Skills 合集开源了!已收录 700+!

在介绍这份令人眼花缭乱的“武器库”之前,先给还不了解 OpenClaw 的朋友补个课。 简单来说,OpenClaw 是目前 GitHub 上最火的本地化 AI Agent 平台(前身是 Clawd/Moltbot)。不同于只能在网页里陪聊的 ChatGPT,OpenClaw 是一个运行在你电脑终端里的“数字管家”。 * 本地优先:直接运行在你的 Mac/Linux/Windows 上,数据不出本地,拥有 Docker 沙箱级安全保护。 * 全渠道接入:你可以通过 WhatsApp、Telegram、Slack 甚至 iMessage 随时指挥它。 * 行动派:它不只是给你建议,而是能直接读写文件、运行命令、调用 API。 如果说 OpenClaw 是一个强悍的操作系统,那么下面要介绍的

By Ne0inhk
开源模型应用落地-知识巩固-生产级AI服务优化(二)

开源模型应用落地-知识巩固-生产级AI服务优化(二)

一、前言     在构建基于Flask的AI接口服务时,采用蓝图(Blueprint)架构可以大幅提升应用的可管理性和扩展性。通过将不同功能模块(如用户认证、模型处理和数据管理)组织成独立的蓝图,我们可以更加清晰地划分代码结构,使团队协作和后续维护变得更加高效。同时,借助 `python-dotenv` 来管理敏感信息和环境变量,则进一步增强了应用的安全性和灵活性。通过合理的模块化设计与高效的环境设置,我们能够优化 AI 服务的开发和部署流程,提升服务的性能与用户体验。 二、术语介绍 2.1. Loguru     是一个用于 Python 的日志库,旨在简化日志记录的过程,提供比 Python 内置的 `logging` 模块更易用和更强大的功能。Loguru 不仅使得日志记录更加简单直观,还提供了许多功能,例如: 1. 简单易用:Loguru 的接口设计得非常直观,用户只需几行代码即可开始记录日志。 2. 丰富的功能:它支持多种日志级别、格式化、过滤、

By Ne0inhk