Pipenv 是 Python 官方推荐的的包管理工具,它集成了 virtualenv、pyenv 和 pip 三者的功能。 Pipenv 是 requests 的作者 Kenneth Reitz 大神开发了用于创建和管理 Python 虚拟环境的工具。

Pipenv 主要解决了以下问题:

  • 不用再单独使用 virtualenv 和 pip,而是将两者结合
  • 不用再维护 requirements.txt,使用 Pipfile 和 Pipfile.lock 来代替
  • 可以在开发环境使用多个 Python 版本
  • 在安装的 pyenv 条件下,可以自动安装需要的 Python 版本
  • 随时查看图形化的依赖关系

入门

安装

和普通的第三方包安装相同,直接使用 pip 命令进行安装。

$ pip install pipenv

创建虚拟环境

虚拟环境是每个 Python 项目的独立执行环境。

$ cd mytest
$ pipenv install
Creating a virtualenv for this project...
Pipfile: /root/deploys/mytest/Pipfile
Using /usr/bin/python (2.7.15) to create virtualenv...
⠋ Creating virtual environment...Already using interpreter /usr/bin/python
New python executable in /root/.local/share/virtualenvs/mytest-2D3nqn7b/bin/python
Installing setuptools, pip, wheel...
done.
✔ Successfully created virtual environment!
Virtualenv location: /root/.local/share/virtualenvs/mytest-2D3nqn7b
Creating a Pipfile for this project...
Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Updated Pipfile.lock (dfae9f)!
Installing dependencies from Pipfile.lock (dfae9f)...
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
$ ls
Pipfile Pipfile.lock

我们在一个新项目的目录中创建了虚拟环境,默认使用的是系统的 Python2 版本,当然也可以指定 Python 版本。Pipenv 也自动为我们选择虚拟环境的存储位置,创建完成之后目录下出现了 PipfilePipfile.lock 两个文件。

激活和退出虚拟环境

激活虚拟环境

$ pipenv shell

退出虚拟环境

$ exit //或者 ctrl+d

安装第三方包

既然 Pipenv 能够替代 pip,那么我们就直接使用 Pipenv 命令来安装软件包

$ pipenv install requests
Installing requests...
Adding requests to Pipfile's [packages]...
✔ Installation Succeeded
Pipfile.lock (ab273c) out of date, updating to (dfae9f)...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
✔ Success!
Updated Pipfile.lock (ab273c)!
Installing dependencies from Pipfile.lock (ab273c)...
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00:00:02
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

使用 Pipenv 安装第三方包不需要激活虚拟环境,会直接下载到虚拟环境中。如果使用 pip 安装,我们需要先激活项目的虚拟环境才能保证软件包的正确安装。安装完包之后,Pipfile 和 Pipfile.lock 两个文件会被更新。

$ cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
requests = "*"
[requires]
python_version = "2.7"
$ cat Pipfile.lock
{
"_meta": {
"hash": {
"sha256": "9838c8bf3aa442453b393e09e534ba7e1666aab4da1b9b408ecdf3ae58ab273c"
},
"pipfile-spec": 6,
"requires": {
"python_version": "2.7"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"certifi": {
"hashes": [
"sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7",
"sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033"
],
"version": "==2018.11.29"
},
"chardet": {
"hashes": [
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
],
"version": "==3.0.4"
},
"idna": {
"hashes": [
"sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
"sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
],
"version": "==2.8"
},
"requests": {
"hashes": [
"sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e",
"sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b"
],
"index": "pypi",
"version": "==2.21.0"
},
"urllib3": {
"hashes": [
"sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39",
"sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22"
],
"version": "==1.24.1"
}
},
"develop": {}
}

Pipfile 文件中记录了如下信息:

  • pip 仓库地址
  • 需要下载哪些包, * 表示始终下载最新版本,dev-packages 表示专用于开发阶段使用的包
  • Python 版本

Pipfile.lock 文件中记录了包的详细信息:

  • hash 值
  • 依赖关系

有了 Pipfile 文件当我们把项目部署到生产环境时,直接 pipenv install 就自动创建虚拟环境并把包安装好。

常用命令

pipenv 选项

Options:
--where Output project home information.
--venv Output virtualenv information.
--py Output Python interpreter information.
--envs Output Environment Variable options.
--rm Remove the virtualenv.
--bare Minimal output.
--completion Output completion (to be eval'd).
--man Display manpage.
--support Output diagnostic information for use in GitHub issues.
--site-packages Enable site-packages for the virtualenv. [env var:
PIPENV_SITE_PACKAGES]
--python TEXT Specify which version of Python virtualenv should use.
--three / --two Use Python 3/2 when creating virtualenv.
--clear Clears caches (pipenv, pip, and pip-tools). [env var:
PIPENV_CLEAR]
-v, --verbose Verbose mode.
--pypi-mirror TEXT Specify a PyPI mirror.
--version Show the version and exit.
-h, --help Show this message and exit.

pipenv 命令参数

Commands:
check Checks for security vulnerabilities and against PEP 508 markers
provided in Pipfile.
clean Uninstalls all packages not specified in Pipfile.lock.
graph Displays currently-installed dependency graph information.
install Installs provided packages and adds them to Pipfile, or (if no
packages are given), installs all packages from Pipfile.
lock Generates Pipfile.lock.
open View a given module in your editor.
run Spawns a command installed into the virtualenv.
shell Spawns a shell within the virtualenv.
sync Installs all packages specified in Pipfile.lock.
uninstall Un-installs a provided package and removes it from Pipfile.
update Runs lock, then sync.

pipenv 常用命令示例

创建项目虚拟环境指定 Python 版本

$ pipenv --python 3.7
$ pipenv --python 2.7.15

不必显式激活虚拟环境,用虚拟机环境执行命令

$ pipenv run python -m http.server
$ pipenv run python test.py

软件包只安装到开发环境

$ pipenv install pytest --dev

删除虚拟环境,该操作会把虚拟环境目录和里面所有的依赖包删除,但是 Pipfile 和 Pipfile.lock 文件会保留

$ pipenv --rm

删除软件包

$ pipenv uninstall requests

生成 requirements.txt 格式

$ pipenv lock -r
$ pipenv lock -r -d //生成 dev-packages 的 requirements.txt

导入 requirements.txt

$ pipenv install -r requirements.txt

显示依赖树

$ pipenv graph

安全检查

$ pipenv check