之前介绍过《利用pyenv管理多个版本的python》,pyenv 是一个非常好用的 Python 版本管理工具,利用它我们可以在同一台电脑上安装多个版本的 Python ,这个过程非常简单。Mac系统的电脑一行命令就可以安装了:
brew install pyenv
复制代码
pyenv 的安装和使用详见开篇提到的文章,这里不再赘述。
今天主要是想介绍另一个非常好用的 Python 工具——"Pipenv"
Pipenv是什么?
Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world. Windows is a first-class citizen, in our world.
It automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your
Pipfile
as you install/uninstall packages. It also generates the ever-importantPipfile.lock
, which is used to produce deterministic builds.
上段引用自官方文档,简单来说就是 Pipenv 是希望成为 Python 界最好的包管理工具,成为 Python 界的 npm。你可以使用 Pipenv 这一个工具来安装、卸载、跟踪和记录依赖性,并创建、使用和组织你的虚拟环境。 当你使用它启动一个项目时,如果你还没有使用虚拟环境的话,Pipenv 将自动为该项目创建一个虚拟环境。 Pipenv 使用 Pipfile
和 Pipfile.lock
来管理依赖包,并且在使用 pipenv 添加或删除包时,自动维护 Pipfile 文件,同时生成 Pipfile.lock 来锁定安装包的版本和依赖信息,避免构建错误。相比pip需要手动维护requirements.txt 中的安装包和版本,具有很大的进步。
为什么要使用 Pipenv
设想一个场景:你手头有多个开发项目,其中项目 A 和项目 B 要求用 Python3,项目C需要用 Python2,而项目 A 和项目 B 又要求第三方依赖包相互独立,互不干扰。
这个时候,为了满足版本的不同我们需要使用 Pyenv 安装多个版本的 Python ,同时为了使不同项目之间隔离开来,我们可以使用 Pipenv 创建虚拟的开发环境。
那有的人就要问了,virtualenv
不就可以创建虚拟环境了吗,为什么还要使用 Pipenv ,这里先卖个关子,文末我再来比较这些常见工具之间的差异性。
使用 Pipenv
安装 Pipenv
如果你是Mac电脑,那么推荐使用Homebrew来安装。
brew install pipenv
复制代码
如果不是Mac电脑,建议 使用Python3的pip3 安装:
pip3 install pipenv
复制代码
执行pipenv,可以查看pipenv的帮助信息:
pipenv
复制代码
如果出现如下信息,就说明安装成功了:
为项目创建虚拟环境
默认地,虚拟环境会创建在~/.local/share/virtualenvs
目录里面。 如果我们希望在每个项目的根目录下保存虚拟环境目录(.venv),需要在 .bashrc
或 .bash_profile
中配置如下:
export PIPENV_VENV_IN_PROJECT=1
复制代码
要想使配置生效,执行下source ~/.bashrc
或者source ~/.bash_profile
即可使环境变量生效。 接下来我们为项目创建虚拟环境。
mkdir pipenv_demo
cd pipenv_demo
pipenv --python 3.6.7 # 为当前初始化一个版本为 3.6.7 的python环境
复制代码
首次运行
如果是第一次在项目中运行 pipenv
命令的话,会在项目中创建一个名为 Pipfile
的文件,文件内容类似下面这样。
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests-html = "*"
[dev-packages]
[requires]
python_version = "3.7"
复制代码
这个文件就类似于 maven 中的 pom.xml
、npm 中的 package.json
文件。如果运行过install、update等命令的话,还会创建一个Pipfile.lock
文件,类似npm中的lock文件。这两个文件就是pipenv用于管理第三方库的配置文件,如果同时使用版本控制软件的话,需要将它们也加入进去。
Tips:对于这个文件我们需要先做一件事,就是更改 [[source]] 中的 url 为国内镜像。
[[source]] url = "https://pypi.tuna.tsinghua.edu.cn/simple" 复制代码
常用命令
安装项目依赖
如果我想在项目中安装requests这个包,运行:
pipenv install requests
复制代码
如果需要指定具体版本号,可以这样:
pipenv install requests==2.13.0
复制代码
如果是第一次运行pipenv的话,会先创建Pipfile文件,否则会修改Pipfile文件。
该命令还有一个常用参数-d或--dev,用于安装仅供开发使用的包。
Tips:用 git 管理项目时候,要把
Pipfile
和Pipfile.lock
加入版本跟踪。这样 clone 了这个项目的同学,只需要执行pipenv install 复制代码
就可以安装所有的Pipfile中 [packages]部分的包了,并且自动为项目在自己电脑上创建了虚拟环境。
卸载某个依赖
相应的还有命令来卸载第三方包,该命令还有两个参数--all
和--all-dev
用于卸载所有包和所有开发包。
pipenv uninstall requests
复制代码
更新项目依赖
查看所有需要更新的包:
pipenv update --outdated
复制代码
更新所有包:
pipenv update
复制代码
更新指定的包:
pipenv update <包名>
复制代码
其他命令
pipenv -h # 查看帮助
pipenv graph # 查看已安装的包
pipenv shell # 启动shell
pipenv run python hello.py # 运行脚本
复制代码
Python 管理哪家强?
还记得在最开始提出的问题吗?明明virtualenv
就可以创建虚拟环境了吗,为什么还要使用 Pipenv 呢?
接下来我们来横向对比下几个常见的容易弄混的 python 管理工具(我在初学的时候总是分不清?)
工具 | 介绍 | 原理 |
pip | 包管理工具 | |
virtualenv | 虚拟环境管理工具 | 切换目录 |
virtualenvwrapper | 虚拟环境管理工具加强版 | |
pyenv | python版本管理工具 | 修改环境变量 |
pyenv-virtualenv | 虚拟环境管理工具 | |
pipenv | 项目环境管理工具 | |
anaconda | 一个包含180+的科学包及其依赖项的发行版本(不只是 Python 可用) |
同时在推荐一个我在 stackoverflow 上看到的回答:What is the difference between pyenv, virtualenv, anaconda?
实践建议:
建议团队内开发人员,在自己电脑上都安装 pyenv 和 pipenv 。Pipfile 和 Pipfile.lock 加入版本跟踪,.venv 不要加入版本管理。为自己的每一个项目建立独立的虚拟环境。
参考
- What is the difference between pyenv, virtualenv, anaconda?
- 利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
- pipenv快速入门