Python 绕不过去的一道坎就是多环境管理了,为何 Python 要多环境管理呢?javascript
这个得从 Python 的依赖管理提及。html
从前有个 Python 解释器,名字叫小派,和其余 Python 解释器相比,他很是富有。java
由于他建了一个仓库,专门用来存放他多年以来积攒下来的装备(库),每场战斗(项目)须要什么装备,他都去这个仓库找,既方便又经济。当其余 Python 解释器还要在每场战斗(项目)前买装备(库)时,他已经拿了现成的装备冲锋了。python
长此以往,其余 Python 解释器还在疲于打怪刷装备,可是小派却不多,愈来愈富有,副本刷的那叫一个快啊!git
小派给这个仓库取了个名字,叫 site-packages,他也很无私,将他的经验传授给了其余 Python 解释器。其余的 Python 解释器都开始效仿小派,建了 site-packages 仓库,今后你们走上了狂刷副本的巅峰。github
然而好景不长,又出现了新的问题。shell
这是一场艰难的战斗(项目),队长要求小派带上他最擅长的 98K 1.2 版本,配合先锋突击队,远程狙杀。npm
嘭!嘭!嘭!随着一声声枪响,敌人一个个倒下。正当突击队兴奋之时,一个庞然巨物忽然从地底钻出。只见它披着厚重的装甲,提着加特林机枪对着突击队一阵扫射。是装甲巨兽!突击队来不及掩蔽,死伤惨重。编程
铛!小派一枪命中巨兽的头颅,可是它的装甲坚固无比,子弹居然被弹开了!bash
小派又连续击中它的多处要害,均没法对它形成伤害。
“这可怎么办?”小派有些心急了,面对队友的伤亡,他第一次感到了无力。
“只能用这个了!”队长拿出一个弹夹给小派,“这是震爆炸弹,是上古遗留的装备,振动波可传到装甲以后,起到隔山打牛的效果。”
“快给我,我来个这个崽子来一发!”小派接过弹夹准备更换。
“诶!?不对啊,这个弹夹怎么装不上,它不是 98K 的吗?”小派疑惑地问。
“是 98K 的,可能上古遗留的装备,只能用在 98K 0.9 版本如下,新的不支持。”队长经验老道,一眼就看出来了。
“那可怎么办?我只有一把 98K 啊,是最新的钛合金版,威力最大。”小派无奈地说。
队长沉思片刻后,说到:“那只能用上大杀器了!它能让你有多个装备仓库,每一个装备能够有独立的版本,互不干扰。这是一类装备,可是它们有个共同的目的:多环境管理!”
让咱们来看看 Python 的多环境管理吧。
Python 多环境隔离,可让你的每一个项目拥有独立的依赖库,即 site-packages。
例如 CentOS 7 系统默认自带了 Python2.7,可是咱们的项目又须要的是 Python3.6。默认 python 命令指向的是 python2.7,而若是咱们要用 python3.6,只能用 python3 命令,有点蛋疼。这时候若是咱们又增长了一个 Python3.8,那咱们就要用 python3.6 命令和 python3.8 命令来区分了,蛋不要了!
因为 Python 的依赖库管理是中心化的,并且大版本上的不兼容且长期并行,就出现了这么一个独特的话题。
你的环境隔离了吗?
Python 社区对这个问题也是倾注了不少精力,涌现了许多优秀的库,下面咱们就来好比如较一下。
为何把 venv 放在第一个,由于它是自 3.3 版本以后添加的官方库,自 3.6 版本以后,成为官方推荐的多环境管理工具。也就是说,你不须要安装任何第三方库就能够实现多环境管理了。
只须要一个命令就能够建立一个虚拟环境。
python3 -m venv /path/to/new/virtual/environment
复制代码
这个命令会生成一个目录,里面的内容以下:
pyvenv.cfg
是咱们的配置文件,为何叫 pyvenv,由于这个库的前身就叫 pyvenv。 而咱们的 site-packages 就在 lib 目录下。
而后咱们须要激活这个环境,运行 bin 目录下的 activate 脚本。
Linux/Mac 以下所示:
注意,激活后环境的名字会出如今命令行前面。
这就是你独立的小天地了,全部 pip 安装的依赖都会在 lib 目录下,因此每一个项目都会有本身的一套隔离环境。激活后使用的 python 和 pip 程序实际上是 bin 目录下的程序了。
很简单吧,不用安装其余的库就能使用,可是 venv 也有本身的缺点,最大的就是不能自动建立不一样版本的 Python 环境。
virtualenv 能够说是 venv 的加强版本,不过早在 venv 出现以前,virtualenv 就算是最受欢迎的命令行环境管理工具了。venv 的许多特性也是借鉴的 virtualenv,相比于 venv,其强大之处主要在:
virtualenv 的原理和使用方式和 venv 相似。
首先须要安装
Python3.5 版本以后推荐使用 pipx 安装
pipx install virtualenv
复制代码
也可使用 pip 安装
python -m pip --user install virtualenv
复制代码
使用更简单
virtualenv
复制代码
就使用 virtualenv 默认的 Python 解释器建立了一个包含基础库(例如 pip,setuptools,wheel)的虚拟环境。而后,一样使用 activate 脚本激活环境。
指定目录和 Python 版本
virtualenv venv -p python3
复制代码
激活后可使用 deactivate
脚本退出环境。
固然,你能够自定义初始化的基础库,激活脚本等,功能强大。
pyenv 主要用来对 Python 解释器进行管理,能够管理系统上的多个版本的 Python 解释器。它的主要原理就是将新的解释器路径放在 PATH 环境变量的前面,这样新的 python 程序就“覆盖”了老的 python 程序,达到了切换解释器的目的。
使用 git 来安装
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
复制代码
配置环境变量
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
复制代码
安装一个新的 Python 解释器
pyenv install 2.7.8
复制代码
设置全局默认解释器
pyenv global 2.7.8
复制代码
更多的命令能够参考文档,能够配合 virtualenv 使用,使用 pyenv-virtualenv 实现自动化。
pipenv 是一款比较新的包管理工具,其借鉴了 javascript 的 npm 和 PHP 的 composer 等理念,经过一个依赖描述文件 Pipfile
来安装和管理依赖,以达到协同开发的目的。若是你熟悉 npm 或者 composer 的话,那 pipenv 正合你胃口。pipenv 其实整合了 pip 和 virtualenv 等库,在其上推出了更便捷的使用方式。
安装 pipenv
pip install --user pipenv
复制代码
建立虚拟环境
pipenv --three # python3
pipenv --two # python2
复制代码
而后编辑目录下的 Pipfile
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests = "*"
[dev-packages]
pytest = "*"
复制代码
而后安装全部依赖
pipenv install # 相似与 npm install
复制代码
命令行安装一个依赖并添加到 Pipfile
pipenv install <package> # 相似与 npm install <package>
复制代码
依赖的安装详情也会写入 Pipfile.lock
文件
激活环境
pipenv shell
复制代码
而新人接手旧的项目也只要pipenv install
一下就行了。
是否是很酷!
最后说说 conda,conda 是一个神奇的库,它是著名的 Python 发行版 Anaconda 附带的包管理工具。它其实不是针对 Python 环境管理,而是 Python, R, Ruby, Lua, Scala, Java, JavaScript, C/ C++, FORTRAN 等等语言的包、依赖和环境管理工具。它的野心很大,甚至还有 UI 界面。
conda 的安装能够在官网下载 Anaconda 或者 Miniconda,Miniconda 是基本的命令行功能,而 Anaconda 有界面,经常使用 Python 库,相关软件、学习资源等,是科学计算的全能工具包,也能够做为 Python 的环境管理工具。
查看全部环境
conda env list
复制代码
建立一个新环境
conda create -n python2 python=2
复制代码
激活环境
conda activate python2
复制代码
退出环境
conda deactivate
复制代码
界面管理环境
conda 除了管理环境,还有其余不少功能。例如和 pip 同样安装依赖的功能。
conda install requests
复制代码
列出安装的包
conda list
复制代码
删除依赖
conda remove requests
复制代码
conda 实际上是在 anaconda 的安装目录下的 envs 子目录下建立环境,而不是项目目录下,也就是说,多个项目实际上是能够共用同一个环境的。
不过,用 conda 来安装依赖和 pip 不太同样,conda 能够安装一些非 python 的依赖,可是 python 的依赖没有 pip 全,安装 python 依赖仍是能够继续使用 pip。
Anaconda 的界面甚至还有许多科学计算的软件、免费学习教程、文档等等,用好了很是强大。
下面我来总结一下
优势:Python3.3 以上无需额外安装依赖,使用简单
缺点:功能有限
适用性:只适用于简单建立隔离目录的需求
优势:虚拟环境功能完善
缺点:仅仅是命令行工具,不便于工程化
适用性:适用于命令行爱好者
优势:方便的多版本管理
缺点:其余库很强,显得略有鸡肋
适用性:适用于仅须要多个 Python 版本的管理
优势:便于项目内部协同工做
缺点:Bug 不少,确实比较年轻,安装的流程有些让人困惑,不像 pip 这么直接好理解
适用性:喜欢 npm 相似体验的人
优势:功能不少,还有 UI
缺点:就 Python 包管理而言,过重
适用性:喜欢 Anaconda 科学计算开发包或者 UI 界面管理的人
不知道你们钟爱哪一款?
嘭!一声巨响后,装甲巨兽抱头倒下。“这个玩意还不错嘛!”小派嘴角微微上扬,“如今我可有无限仓库了。”