Python 多環境管理總結

前言

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。

  • 若是兩個項目的依賴相沖突,可起到隔離的做用
  • 能夠多個 Python 版本共存,如 Python2 和 Python3
  • 依賴統一管理,方便項目協做和遷移
  • 項目獨立打包等

例如 CentOS 7 系統默認自帶了 Python2.7,可是咱們的項目又須要的是 Python3.6。默認 python 命令指向的是 python2.7,而若是咱們要用 python3.6,只能用 python3 命令,有點蛋疼。這時候若是咱們又增長了一個 Python3.8,那咱們就要用 python3.6 命令和 python3.8 命令來區分了,蛋不要了!

因爲 Python 的依賴庫管理是中心化的,並且大版本上的不兼容且長期並行,就出現了這麼一個獨特的話題。

你的環境隔離了嗎?

多環境隔離解決方案

Python 社區對這個問題也是傾注了不少精力,涌現了許多優秀的庫,下面咱們就來好比如較一下。

venv

爲何把 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

virtualenv 能夠說是 venv 的加強版本,不過早在 venv 出現以前,virtualenv 就算是最受歡迎的命令行環境管理工具了。venv 的許多特性也是借鑑的 virtualenv,相比於 venv,其強大之處主要在:

  • 更快
  • 擴展性更強
  • 自動發現並可建立多版本的 Python 環境
  • 可經過 pip 更新
  • 豐富的編程接口

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

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

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,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 的界面甚至還有許多科學計算的軟件、免費學習教程、文檔等等,用好了很是強大。

  • 易用性:🌟🌟
  • 功能性:🌟🌟🌟🌟🌟

總結

下面我來總結一下

venv

優勢:Python3.3 以上無需額外安裝依賴,使用簡單

缺點:功能有限

適用性:只適用於簡單建立隔離目錄的需求

virtualenv

優勢:虛擬環境功能完善

缺點:僅僅是命令行工具,不便於工程化

適用性:適用於命令行愛好者

pyenv

優勢:方便的多版本管理

缺點:其餘庫很強,顯得略有雞肋

適用性:適用於僅須要多個 Python 版本的管理

pipenv

優勢:便於項目內部協同工做

缺點:Bug 不少,確實比較年輕,安裝的流程有些讓人困惑,不像 pip 這麼直接好理解

適用性:喜歡 npm 相似體驗的人

conda

優勢:功能不少,還有 UI

缺點:就 Python 包管理而言,過重

適用性:喜歡 Anaconda 科學計算開發包或者 UI 界面管理的人

不知道你們鍾愛哪一款?

後記

嘭!一聲巨響後,裝甲巨獸抱頭倒下。「這個玩意還不錯嘛!」小派嘴角微微上揚,「如今我可有無限倉庫了。」

參考

相關文章
相關標籤/搜索