使用Pipenv管理Python项目
pip + pyvenv 方案的不足
- 手动更改版本包后,需要定期更新 requirements.txt 文件,以保持项目环境的一致。
- 项目中含有多个 requirement.txt 文件的,比如区分开发环境和生产环境,现有方案无法满足复杂需要;
- 卸载包的时候不能处理相关依赖包,造成包管理的混乱;
Pipenv
主要特性包含:
- Enables truly deterministic builds, while easily specifying only what you want.
- 为锁定的版本包生成并检查 hash,确保安全性;
- 如果
pyenv
可用,自动安装所需的 Pythons; - 通过查找自动递归找到项目
Pipfile
文件(有点像 git); Pipfile
不存在时自动生成(类比 requirement.txt 是不是有很大的优势);- 在指定位置自动创建虚拟环境;
Pipfile
在卸载/安装软件包时自动添加/删除软件包。- 自动加载
.env
文件,可以为项目设置环境变量(与 Flask 配合相当好用吧);
主要命令是 install
,uninstall
和 lock
。
PS:Pipenv的作者是 Kenneth Reitz 大神,他写了 requests。
安装和配置
安装
通过 brew 安装(也可以通过 pip 安装):
|
|
配置
编辑 ~/.zshrc
文件
指定 virtualenv 存储路径
默认 virtualenv 都存储在 ~/.local/share/virtualenvs
目录下。
通过环境变量指定目录(最好使用绝对路径):
|
|
如果要保存到项目目录下的 .venv
目录,设置:
|
|
基本操作
新建虚拟环境
使用 pipenv shell
或 pipenv install
命令都能够自动触发创建虚拟环境。执行后会在目录中新建 Pipfile
和 Pipfile.lock
文件,这两个文件要加入 VCS。
或者直接指定 Python 版本,配合 pyenv 使用效果更佳。
|
|
安装软件包
安装指定包:
|
|
安装 Pipfile 文件中指定的包:
|
|
以上两个命令都支持 --dev
选项,表示安装为开发环境使用的包。
另外,安装 Pipfile.lock 文件中指定的所有包:
|
|
使用虚拟环境
进入虚拟环境
|
|
退出虚拟环境
|
|
使用虚拟环境执行命令,但不进入虚拟环境:
|
|
查看依赖关系
|
|
输出
|
|
还可以输出 json 格式
|
|
卸载软件包
使用 uninstall 命令
|
|
但是该命令不会自动卸载软件包的依赖包,例如卸载 requests 时不会自动卸载 urllib3。
可以借助 graph 命令获得依赖关系并卸载
|
|
其中 depends.py 用于解析依赖关系:
|
|
检查安全问题
根据 PEP 508 检查当前管理的软件包版本是否存在漏洞
|
|
支持 .env
文件
Pipenv 在执行 pipenv run
和 pipenv shell
命令时,如果在项目目录(即 Pipfile
的同级目录)下,存在 .env
文件,则会自动加载 .env
文件中的环境变量。
.env
文件不应加入到 VCS 中,因为它一般存储账号密码等关键保密信息。