venv 主要用来管理 Python 的执行环境,简单说来就是管理包的版本,是无法控制 Phthon 的版本的。比如想在 Python3.6 与 Python3.8之间切换,靠现阶段的 venv 是做不到的,可能需要借助 conda、pyenv 之类的工具。
从 Python 3.4 开始,pip 与 venv 模块会在安装 Python 时一起默认安装。
创建虚拟环境
python -m venv {project name}
如果是当前目录,直接使用
python -m venv .
就行了。此时在 {project name} 文件夹下创建下述文件夹:
Include
Lib
Scripts(也有可能是 bin 之类的名称)
pyvenv.cfg
用 venv 工具创建出的虚拟环境,初始只装有 pip 与 setuptools 模块,除此之外,没有预装其他的软件包。
激活虚拟环境
./Scripts/activate
不同的操作系统脚本文件可能不一致,比如 windows 下面是 activate.bat 。 如果在 linux 环境下,可以使用:
source ./Scripts/activate
执行脚本之后,就会激活虚拟环境,此时执行:
which python
可以查看相关的 python 或者 pip 信息。
安装依赖
在激活的终端里面,可以使用 pip 安装对应的模块。比如:
pip install json5
通过
pip show json5
可以验证 json5 的安装路径以及其他信息。
退出虚拟环境
通过与 activate 相反的 deactivate 操作,即可回到默认环境。
重建依赖
使用 pip freeze 命令把当前环境所依赖的包明确地保存到一份外部文件中(按照惯例,这个文件命名为 requirements.txt)。
python3 -m pip freeze > requirements.txt
或者:
pip freeze > requirements.txt
就会在执行目录生成一份 requirements.txt 文件,内容如下:
json5==0.9.6
如果对版本规则比较熟悉,也可以手写这份文件。
假设要用 {project name} 环境之中的配置来构建另外一套相似虚拟环境。我们先用venv工具把那套环境创建出来,然后用activate激活它。具体命令可以参见 上文。
我们可以执行python3 -m pip install命令,把刚才用 python3 -m pip freeze 所保存的 requirements.txt 文件通过 -r 选项传给它,这样就能够将那份文件所记录的软件包安装到这套环境里面了。
python3 -m pip install -r /a/b/c/d/requirements.txt
或者:
pip install -r requirements.txt
哈希值检查
要实现哈希检查模式,只需在需求文件中写入带有包名的摘要:
json5==0.9.6 --hash=sha256:{hash digest}
支持的哈希算法包括 md5、sha1、sha224、sha224、sha384、sha256 和 sha512。
需要注意的问题
- Python本身的版本并不包含在requirements.txt之中,所以必须单独管理。
- 虚拟环境有个很容易出错的地方,就是不能直接把它移动到其他路径下面,因为它里面的一些命令(例如python3)所指向的位置都是固定写好的,其中用到了这套环境的安装路径,假如移动到别处,那么这些路径就会失效。
参考《Effective Python》,纯做记录用。