Python 用 venv 创建虚拟环境

venv 是 Python3.3 以后的功能,官方文档在此

创建虚拟环境

先创建一个目录,这个目录作为当前 Python 工程的根:

1
jiji@play:~$ mkdir pycode && cd pycode

使用如下命令创建一个 venv 虚拟环境:

1
jiji@play:~/pycode$ python -m venv .

在 Debian/Ubuntu 系统中,需要单独安装 venv 的依赖,使用 sudo apt install python3.8-venv 为 Python 3.8 安装依赖:

1
2
3
4
5
6
7
8
9
jiji@play:~/pycode$ python -m venv .
The virtual environment was not created successfully because ensurepip is not
available. On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

apt install python3.8-venv

You may need to use sudo with that command. After installing the python3-venv
package, recreate your virtual environment.

随后再执行该命令即可,创建完成后目录下会增加几个文件:

1
2
3
4
5
6
7
8
9
jiji@play:~/pycode$ python -m venv .venv
jiji@play:~/pycode$ ls -la
total 12
drwxrwxr-x 3 jiji jiji 4096 Dec 9 03:01 .
drwxr-xr-x 12 jiji jiji 4096 Dec 9 02:31 ..
drwxrwxr-x 6 jiji jiji 4096 Dec 9 03:01 .venv
jiji@play:~/pycode$ cd .venv
jiji@play:~/pycode/.venv$ ls
bin include lib lib64 pyvenv.cfg share

进入虚拟环境

POSIX

Shell Command
bash / zsh $ source .venv/bin/activate
fish $ source .venv/bin/activate.fish
csh / tcsh $ source .venv/bin/activate.csh
PowerShell $ .venv/bin/Activate.ps1

Windows

Shell Command
cmd.exe C:\> .venv\Scripts\activate.bat
PowerShell PS C:\> .venv\Scripts\Activate.ps1

在输入相关脚本后,命令行前面新增了一个 (.venv),这就表明我们当前的命令行在虚拟环境中,与全局的环境隔离:

1
2
jiji@play:~/pycode$ source .venv/bin/activate
(.venv) jiji@play:~/pycode$

我们可以在 Python 文件的第一行前加上如下代码,即可在运行时自动使用虚拟环境运行:

1
#!/.venv/bin/python

退出虚拟环境

在虚拟环境内输入 deactivate 命令就能退出:

1
2
(.venv) jiji@play:~/pycode$ deactivate
jiji@play:~/pycode$

与 VSCode 配合使用

这波与 VSCode 配合的很好捏~

在安装了 Python 的扩展后,VSCode 可以自动检测到目录下的 venv 环境并自动载入之,唯一需要注意的是请打开整个工程文件夹。

优点

我们在内部使用 pip 安装的依赖,不会被同步到全局,而是只存在于当前工程。这种设计与 npm 中的局部安装 node_modules 文件夹是类似的。

这种设计可以更方便而干净的导出依赖。我们在完成一个工程时可能会用到一些依赖,为了方便其他人安装,通常都需要导出 requirements.txt 以便于其他人复现,但如果采用全局安装,导出时通常会导出一些不必要的依赖(除非你为每个项目都安装了自己的 Python),因为 Python 的依赖是全局安装的,所以导出时总会把全部依赖导出。倘若在虚拟环境内部导出,就只会导出当前项目的依赖了,这样就方便而干净。

这种设计更便于处理依赖冲突,倘若我们需要在 A 项目中使用 flask==1.0 而在 B 项目中使用 flask==2.0,就最好使用 venv 进行管理,为每个项目都创建一个独立的虚拟环境而安装不同的模块版本,这样就可以同时运行多个项目而不会冲突。

优雅地使用

虽然您认为 venv 是个好用的工具,使用 Python 的最佳实践就是用它来管理依赖,但您不能假设所有人都使用它,因为它仍未成为行业的标准,仍然有不少人在使用全局安装或者 Anaconda 等方案进行依赖管理。

由于 venv 本身和系统环境耦合,为了解耦合,在使用 Git 时,您的最佳实践是将 .venv/ 写入 .gitignore,避免将 .venv/ 提交到 Git 上。

您可以在 venv 环境中使用如下命令以导出依赖:

1
pip freeze > requirements.txt

您可以指导用户(当然,您也可以在 venv 中这么做)使用下面的命令来安装依赖:

1
pip install -r requirements.txt

包管理的哲学

依赖是包

任何情况下依赖就是包,所以任何一个工程也可以变成依赖。依赖暴露一些接口,而工程导入这些接口就可以调用。

可索引的依赖

所有的依赖都应该通过一个文件来索引,这个文件应该具有可读性,可以手工编辑,并且可通过包管理器安全地一键安装依赖。安全地安装依赖指,在安装完成之后,当前的代码应能访问到索引文件中依赖的正确版本,且安装过程中不应该影响到任何其他文件夹的项目。

依赖的具体文件不同步

任何时候,依赖的具体文件应该由包管理器通过索引文件来进行安装,不应被同步到其他设备。只有依赖的索引文件可被同步。

Python 用 venv 创建虚拟环境

https://mmdjiji.com/2022/12/1/

作者

吉吉

发布于

2022-12-09

更新于

2024-04-28

许可协议