notes/config/python/venv/venv.md

138 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# venv 使用指南
## venv 简介
在 Python 开发过程中,系统安装的 Python3 安装目录中有个 site-packages 目录,所有第三方的包都会被 pip 安装到这个目录下。
由于 pip 安装的包和 maven 不同,同一个环境中同一个包只能安装一个版本,这样就有两个问题:
1. 普通用户无法安装 pip 到系统目录,这点在 Linux 系统中很明显,非 root 用户无法安装到系统自带的 Python 中;
2. 不同应用的依赖包不同,使用一个环境就会产生版本冲突,使用起来非常麻烦;
为了解决以上问题,早期的 Python pip 仓库有个 virtualenv 包Python3 自带了 venv 可以很方便得实现多应用环境隔离。
venv 的原理是为每个应用单独创建一个目录,目录中包含可执行的 Python 解释器及 site-packages 用于存放 pip 安装的包。
## venv 使用步骤
1. 创建目录;
```bash
$ mkdir proj01
$ cd proj01
```
2. 使用 venv 创建一个独立的 Python 环境;
```bash
$ pwd
/home/work/proj01
$ python -m venv .
```
查看当前目录,可以看见几个文件夹和 `pyvenv.cfg` 文件:
```bash
# [18:08:52 ~/proj01] $ ls -alh
总计 16K
drwxr-xr-x 2 work work 4.0K Nov22日 18:08 bin
drwxr-xr-x 3 work work 4.0K Nov22日 18:06 include
drwxr-xr-x 3 work work 4.0K Nov22日 18:06 lib
lrwxrwxrwx 1 work work 3 Nov22日 18:06 lib64 -> lib
-rw-r--r-- 1 work work 155 Nov22日 18:08 pyvenv.cfg
```
使用 source 命令激活虚拟环境:
```bash
# [18:08:56 ~/proj01] $ source bin/activate
# [18:09:40 (py:proj01) ~/proj01] $
```
可以看到虚拟环境已激活,可以使用 `type python` 命令查看当前使用的是哪个 python
```bash
$ type python
python is /home/work/proj01/bin/python
```
可以在 Python 脚本中使用该目录指定解释器。
## venv 封装脚本使用
基于 venv 的原理,我们对 venv 进行简单的封装,将 venv 虚拟环境统一管理起来,方便部署、运维。
封装脚本为 venv.sh需要使用 `source` 激活:
### 激活 venv 封装函数
```bash
$ source venv.sh
```
激活后,环境中会增加以下几个函数:
### 查看当前已安装的虚拟环境
```bash
$ lsvenv
```
或者
```bash
$ workon
```
### 创建虚拟环境
创建好虚拟环境后默认激活,也可以使用 `workon` 命令激活或者切换虚拟环境。
```bash
$ mkvenv $venv_name
```
创建好虚拟环境后,下一步可以使用 pip 安装三方包,可以设置 pip 安装源为清华源,加快下载速度:
```bash
$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
```
### 激活虚拟环境
```bash
$ workon $venv_name
```
### 取消激活虚拟环境
可以使用封装的 `qvenv`,或者使用 `deactivate`
```bash
$ qvenv
```
### 删除虚拟环境
删除虚拟环境时必须指定一个虚拟环境名称,不传参数会提示并退出。
```bash
$ rmvenv $venv_name
```
## 备注
venv 虚拟环境的激活,适用于在开发、测试阶段定位问题,在线上环境批量调用脚本时,
要在 Python 脚本开头标明使用的哪个 Python 解释器:
```python
#!/usr/bin/env python
```
或者写明 Python 解释器的全路径:
```python
#!/home/work/.venv/pandas/bin/python
```
## 备份 & 迁移
venv 的原理是新建目录隔离不同应用的依赖,因此只要把集中管理虚拟环境的目录,如脚本中使用 `$HOME/.venv` 统一管理,因此只要将此目录打包、解压缩即可实现备份、迁移。