pipenv 是 python 官方推荐的包管理工具,集成了 virtualenv、pyenv 和 pip 三者的功能于一身,相似于 php 中的 composer。php
咱们知道,为了方便管理 python 的虚拟环境和库,一般使用较多的是 virtualenv 、pyenv 和 pip,可是他们不够好用或者说不够偷懒。因而 requests 的做者 Kenneth Reitz 开发了用于建立和管理 python 虚拟环境的工具 —- pipenv。python
它可以自动为项目建立和管理虚拟环境,从 Pipfile 文件中添加或者删除包,同时生成 Pipfile.lock 文件来锁定安装包的版本和依赖信息,避免构建错误。git
pipenv 主要解决了如下问题:shell
因为个人开发环境一直都是 Mac 笔记本,因此这里只介绍在 Mac 环境如何安装好了。安全
$ pip install --user pipenv
这个命令在用户级别(非系统全局)下安装 pipenv。若是安装后 shell 提示找不到 pipenv 命令,你须要添加当前 Python 用户主目录的 bin 目录到 PATH 环境变量。若是你不知道 Python 用户主目录在哪里,用下面的命令来查看:bash
$ python -m site --user-base
你会看到相似下面的输出composer
/Users/liyafeng/Library/Python/3.6
Mac 下使用 brew 安装软件应该是最方便的了,推荐使用:编辑器
brew install pipenv
升级 pipenv:工具
brew upgrade pipenv
Linux or Mac 环境下,bash下若是能自动命令补全岂不是更好?请把以下语句追加到.bashrc
或者.zshrc
便可:post
eval "$(pipenv --completion)"
pipenv 具备的选项:
$ pipenv Usage: pipenv [OPTIONS] COMMAND [ARGS]... Options: --where 显示项目文件所在路径 --venv 显示虚拟环境实际文件所在路径 --py 显示虚拟环境Python解释器所在路径 --envs 显示虚拟环境的选项变量 --rm 删除虚拟环境 --bare 最小化输出 --completion 完整输出 --man 显示帮助页面 --three / --two 使用Python 3/2建立虚拟环境(注意本机已安装的Python版本) --python TEXT 指定某个Python版本做为虚拟环境的安装源 --site-packages 附带安装原Python解释器中的第三方库 --jumbotron An easter egg, effectively. --version 版本信息 -h, --help 帮助信息
pipenv 可以使用的命令参数:
Commands: check 检查安全漏洞 graph 显示当前依赖关系图信息 install 安装虚拟环境或者第三方库 lock 锁定并生成Pipfile.lock文件 open 在编辑器中查看一个库 run 在虚拟环境中运行命令 shell 进入虚拟环境 uninstall 卸载一个库 update 卸载当前全部的包,并安装它们的最新版本
一些例子:
Usage Examples: Create a new project using Python 3.6, specifically: $ pipenv --python 3.6 Install all dependencies for a project (including dev): $ pipenv install --dev Create a lockfile containing pre-releases: $ pipenv lock --pre Show a graph of your installed dependencies: $ pipenv graph Check your installed dependencies for security vulnerabilities: $ pipenv check Install a local setup.py into your virtual environment/Pipfile: $ pipenv install -e . Use a lower-level pip command: $ pipenv run pip freeze
mkdir new_env & cd new_env pipenv install // pipenv install --three
若是指定了 --two
或者 --three
选项参数,则会使用 python2 或者 python3 的版本安装,不然将使用默认的 python 版原本安装。固然也能够指定准确的版本信息:
$ pipenv install --python 3 $ pipenv install --python 3.6 $ pipenv install --python 2.7.14
pipenv 会自动扫描系统寻找合适的版本信息,若是找不到的话,同时又安装了 pyenv 的话,则会自动调用 pyenv 下载对应版本的 python, 不然会报错。
这时候在当前 new_env
环境下生成 Pipfile
和 Pipfile.lock
两个环境初始化文件。
进入环境:
pipenv shell
退出环境:
exit //或者 ctrl+d
这里咱们测试安装 urllib3
包好了:
pipenv install urllib3
此时,Pipfile 里有最新安装的包文件的信息,如名称、版本等。用来在从新安装项目依赖或与他人共享项目时,你能够用 Pipfile 来跟踪项目依赖。
Pipfile 是用来替代原来的 requirements.txt 的,内容相似下面这样。source 部分用来设置仓库地址,packages 部分用来指定项目依赖的包,dev-packages 部分用来指定开发环境须要的包,这样分开便于管理。
$ cat Pipfile [[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] "urllib3" = "*" [dev-packages] [requires] python_version = "3.6"
Pipfile.lock 则包含你的系统信息,全部已安装包的依赖包及其版本信息,以及全部安装包及其依赖包的 Hash 校验信息。
$ Pipfile.lock { "_meta": { "hash": { "sha256": "af58f3510cb613d4d9241128f9a0ceb9bb936ad907543e23ad8317011dcb6715" }, "pipfile-spec": 6, "requires": { "python_version": "3.6" }, "sources": [ { "name": "pypi", "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { "urllib3": { "hashes": [ "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" ], "index": "pypi", "version": "==1.23" } }, "develop": {} }
如今安装另外一个包,再次查看这两个文件的内容。你会发现 Pipfile 如今包含两个安装包了,Pipfile.lock 也包含了全部已安装包的依赖包及其版本信息,以及全部安装包及其依赖包的 Hash 校验信息。每次你安装新的依赖包,这两个文件都会自动更新。
pipenv install urllib3==1.22
加 --dev
表示包括 Pipfile 的 dev-packages 中的依赖。
pipenv install httpie --dev
pipenv uninstall urllib3 //或者 pipenv uninstall --all
pipenv update urllib3
更新全部包:
pipenv update
这个命令会删除全部软件包而后从新安装最新的版本。
$ pipenv --venv /Users/liyafeng/.local/share/virtualenvs/new_env-UVLdq9CB
最后的虚拟环境目录是以当前环境 new_env
做为目录开头的。
$ pipenv --where /Users/liyafeng/Documents/www/pythondemo/new_env
你是否担忧已安装的软件包有没有安全漏洞?不要紧,pipenv 能够帮你检查,运行下面的命令:
$ pipenv check Checking PEP 508 requirements… Passed! Checking installed package safety… All good!
上面的命令根据 Pipfile 里的 PEP 508 标记检查安全漏洞。
$ pipenv graph httpie==0.9.9 - Pygments [required: >=2.1.3, installed: 2.2.0] - requests [required: >=2.11.0, installed: 2.19.1] - certifi [required: >=2017.4.17, installed: 2018.4.16] - chardet [required: <3.1.0,>=3.0.2, installed: 3.0.4] - idna [required: <2.8,>=2.5, installed: 2.7] - urllib3 [required: >=1.21.1,<1.24, installed: 1.23]
更新 lock 文件锁定当前环境的依赖版本
pipenv lock
若是你开发调试时须要配一堆环境变量,能够写到 .env 文件中,在 pipenv shell
进入虚拟环境时,它会帮你把这些环境变量加载好,很是方便。
例如写一个 .env 文件:
echo "FOO=hello foo" > .env
以后 pipenv shell
进入虚拟环境,echo $FOO
就能看环境变量的值 hello foo
已经设置好了。