Python 用 venv 创建虚拟环境
venv 是 Python3.3 以后的功能,官方文档在此。
创建虚拟环境
先创建一个目录,这个目录作为当前 Python 工程的根:
1 |
|
使用如下命令创建一个 venv 虚拟环境:
1 |
|
在 Debian/Ubuntu 系统中,需要单独安装 venv 的依赖,使用 sudo apt install python3.8-venv
为 Python 3.8 安装依赖:
1 |
|
随后再执行该命令即可,创建完成后目录下会增加几个文件:
1 |
|
进入虚拟环境
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 |
|
我们可以在 Python 文件的第一行前加上如下代码,即可在运行时自动使用虚拟环境运行:
1 |
|
退出虚拟环境
在虚拟环境内输入 deactivate
命令就能退出:
1 |
|
与 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 |
|
您可以指导用户(当然,您也可以在 venv 中这么做)使用下面的命令来安装依赖:
1 |
|
包管理的哲学
依赖是包
任何情况下依赖就是包,所以任何一个工程也可以变成依赖。依赖暴露一些接口,而工程导入这些接口就可以调用。
可索引的依赖
所有的依赖都应该通过一个文件来索引,这个文件应该具有可读性,可以手工编辑,并且可通过包管理器安全地一键安装依赖。安全地安装依赖指,在安装完成之后,当前的代码应能访问到索引文件中依赖的正确版本,且安装过程中不应该影响到任何其他文件夹的项目。
依赖的具体文件不同步
任何时候,依赖的具体文件应该由包管理器通过索引文件来进行安装,不应被同步到其他设备。只有依赖的索引文件可被同步。
Python 用 venv 创建虚拟环境