pipenv是Python官方推荐的包管理工具。可以说,它集成了virtualenv, pip和pyenv三者的功能。其目的旨在集合了所有的包管理工具的长处,如:
npm, yarn, composer等的优点。
它能够自动为项目创建和管理虚拟环境,从Pipfile文件添加或删除安装的包,同时生成Pipfile.lock来锁定安装包的版本和依赖信息,避免构建错误。
pipenv主要解决了如下问题:
- 不用再单独使用
pip和virtualenv, 现在它们合并在一起了 - 不用再维护
requirements.txt, 使用Pipfile和Pipfile.lock来代替 - 可以使用多个python版本(
python2和python3) - 在安装了
pyenv的条件下,可以自动安装需要的Python版本
安装
为了方便使用, 建议全局安装
|
|
基本概念
- 虚拟环境如果不存在的话,会自动创建
- 当
install命令没有传递参数指定安装包时,所有[packages]里指定的包都会被安装 pipenv --three可以初始化一个python3版本的虚拟环境pipenv --two可以初始化一个python2版本的虚拟环境
添加shell补齐
如果使用的是bash, 可添加下面语句到.bashrc或.bash_profile
|
|
pipenv命令
|
|
常用命令介绍
|
|
高级技巧
导入requirements.txt
当在执行pipenv install命令的时候,如果有一个requirements.txt文件,那么会自动从requirements.txt文件导入安装包信息并创建一个Pipfile文件。
同样可以使用$ pipenv install -r path/to/requirements.txt来导入requirements.txt文件
注意:
默认情况下,我们都是在requirements.txt文件里指定了安装包的版本信息的,在导入requirements.txt文件时,版本信息也会被自动写Pipfile文件里, 但是这个信息我们一般不需要保存在Pipfile文件里,需要手动更新Pipfile来删除版本信息
指定安装包的版本信息
为了安装指定版本的包信息,可以使用:
|
|
这个命令也会自动更新Pipfile文件
指定Python的版本信息
在创建虚拟环境的时候,我们可以指定使用的python版本信息,类似pyenv
|
|
pipenv会自动扫描系统寻找合适的版本信息,如果找不到的话,同时又安装了pyenv, 它会自动调用pyenv下载对应的版本的python
指定安装包的源
如果我们需要在安装包时,从一个源下载一个安装包,然后从另一个源下载另一个安装包,我们可以通过下面的方式配置
|
|
如上设置了两个源:
同时指定requests包从home源下载,maya包从pypi源下载
生成requirements.txt文件
我们也可以从Pipfile和Pipfile.lock文件来生成requirements.txt
|
|
检查安全隐患
pipenv包含了safety模块,可以让我们坚持安装包是否存在安全隐患。
|
|
编码风格检查
pipenv默认集成了flake8, 可以用来检测编码风格
|
|
浏览模块代码
|
|
自动加载环境变量.env
如果项目根目录下有.env文件,$ pipenv shell和$ pipenv run会自动加载它。
|
|
自定义虚拟环境的路径
默认情况下,pipenv使用pew来管理虚拟环境的路径,我们可以自定义WORKON_HOME环境变量来设置虚拟环境的路径。比如:
|
|
我们也可以通过设置环境变量PIPENV_VENV_IN_PROJECT使虚拟环境在每个项目的根目录下project/.venv。
自动激活虚拟环境
配合virtualenv-autodetect和设置PIPENV_VENV_IN_PROJECT环境变量可以自动激活虚拟环境。
在.bashrc或.bash_profile中配置如下
|
|
如果使用了oh-my-zsh, 可以直接使用它的插件形式
|
|
再修改.zshrc文件启动插件
|
|
通过环境变量配置pipenv
pipenv内置了很多环境变量,可以通过设置这些环境变量来配置pipenv
|
|
需要修改某个默认配置时,只需要把它添加到.bashrc或.bash_profile文件里即可。
常见问题
pipenv install时报错pip.exceptions.InstallationError: Command "python setup.py egg_info" failed with error code 1
错误原因是pipenv是用python2安装的,解决办法是使用pip3重新安装pipenv
$ pip unintall pipenv
$ pip3 install pipenv
在项目目录里运行pipenv时报错AttributeError: module 'enum' has no attribute 'IntFlag'
$ pipenv
Failed to import the site module
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 544, in <module>
main()
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 530, in main
known_paths = addusersitepackages(known_paths)
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 282, in addusersitepackages
user_site = getusersitepackages()
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 258, in getusersitepackages
user_base = getuserbase() # this will also set USER_BASE
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 248, in getuserbase
USER_BASE = get_config_var('userbase')
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sysconfig.py", line 601, in get_config_var
return get_config_vars().get(name)
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sysconfig.py", line 580, in get_config_vars
import _osx_support
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_osx_support.py", line 4, in <module>
import re
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/re.py", line 142, in <module>
class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'
是因为在项目目录里运行pipenv命令时,项目虚拟环境的python版本低于3.6.4, 由于IntFlag是从python3.6.4才开始集成到python内置模块的。当激活了项目的虚拟环境之后, 环境变量PYTHONPATH会被设置为当前虚拟环境的site-packages目录,因此pipenv依赖的IntFlag无法找到。
解决办法是在运行pipenv时设置环境变量PYTHONPATH为空
$ PYTHONPATH= pipenv