跳转至

虚拟环境二三事

虚拟环境是什么

虚拟环境(Virtual Environment)是一个独立的Python环境,允许你在同一台机器上同时运行多个不同版本的Python以及各自不同的包和依赖,而不会相互干扰。

这对于开发和部署Python项目非常有用,它能确保项目之间的依赖关系不会发生冲突。

例如,一个项目可能需要Django 2.2,而另一个项目则需要Django 3.0。通过使用虚拟环境,可以在同一台机器上同时管理这两个项目而不发生冲突。

虚拟环境的优点

  1. 依赖隔离:不同项目可以 拥有各自的依赖包版本,不会互相影响。

  2. 可移植性:虚拟环境可以被复制到其他机器上,这样在不同的开发环境或生产环境中,都可以 复现相同的依赖关系,确保代码的可移植性。

3.版本控制:虚拟环境中安装的Python版本和依赖库可以 锁定在特定的版本,这对于保证代码的稳定性和可维护性很重要。

如何使用python虚拟环境

使用情景

我现在有一堆clone下来的实验代码在~/bxhu/下,需要使用虚拟环境安装matplotlib / pandas / numpy等包,那么我要在~/bxhu/中创建虚拟环境

(1) 进入指定工作目录,并初始化创建名为.venv的虚拟环境

Bash
1
2
cd ~/bxhu/
python3 -m venv .venv
Tips

虽然这里.venv的命名不是固定的,可以自定义命名,但我比较推荐按照.venv来,因为这样的命名符合大多数机器自命名的规则,也会把虚拟文件夹默认为ls不主动显示😊

(2) 激活虚拟环境

Bash
1
source .venv/bin/activate

此时你就已经进入虚拟环境了

如果不放心可以检查一下:

Bash
1
which python
Bash
1
2
# if the response is like this, then it's ok
/Users/huluobo/bxhu/.venv/bin/python

(3) 在虚拟环境中,你可以做一系列操作,比如我在这里安装一些package

Bash
1
2
pip install <Package_NAME>
...

(4) 关闭虚拟环境并退出

Bash
1
deactivate

虚拟环境背后的原理是什么

虚拟环境本质上是:一个包含了独立Python可执行文件的目录,同时也包含了独立的site-packages目录,用来安装依赖包。通过使用虚拟环境,Python解释器会首先查找并使用虚拟环境中的库,而不是全局环境中的库,这样保证了环境的隔离。

sys.path的操作:当你激活虚拟环境时,虚拟环境会修改环境变量(如PATH),使得你当前Shell会优先使用虚拟环境中的Python解释器。同时,虚拟环境还会调整Python的sys.path,确保Python在导入模块时优先查找虚拟环境中的依赖包。

事实上如果从python的角度来看层次设计,可以用下面的图表示:

alt text

如何安装“过时”的python虚拟环境

情景:我电脑系统的python是3.12.4,但现在需要以python3.9运行一份代码(pwd = ./A

在不破坏电脑系统python3.12的前提下,我希望是:在A中安装python3.9的虚拟环境,这样在A中调用的所有py都划归成python3.9

Bash
1
brew install [email protected]
Bash
1
brew --prefix [email protected]
Bash
1
2
cd ~/A
/opt/homebrew/opt/[email protected]/bin/python3.9 -m venv .venv
Bash
1
source .venv/bin/activate
Bash
1
2
 python --version
Python 3.9.19
Bash
1
2
3
4
 deactivate  python3 --version
Python 3.12.4