见山之后 Beyond the Mountain
实战教学 /

Python 管理哪家强?

Pipenv - The Officially Recommended Python Packaging Tool

之前介绍过《利用 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-important Pipfile.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虚拟环境管理工具加强版
pyenvpython 版本管理工具修改环境变量
pyenv-virtualenv虚拟环境管理工具
pipenv项目环境管理工具
anaconda一个包含 180+的科学包及其依赖项的发行版本(不只是 Python 可用)

同时在推荐一个我在 stackoverflow 上看到的回答:What is the difference between pyenv, virtualenv, anaconda?

实践建议:

建议团队内开发人员,在自己电脑上都安装 pyenv 和 pipenv 。Pipfile 和 Pipfile.lock 加入版本跟踪,.venv 不要加入版本管理。为自己的每一个项目建立独立的虚拟环境。

参考

  1. What is the difference between pyenv, virtualenv, anaconda?
  2. 利用 pipenv 和 pyenv 管理多个相互独立的 Python 虚拟开发环境
  3. pipenv 快速入门