學(xué)Python有段時(shí)間了痒筒,學(xué)的時(shí)候會(huì)想著拿它和Java對(duì)比悉抵。
在對(duì)比的時(shí)候袜腥,發(fā)現(xiàn) Java 有很成熟的項(xiàng)目構(gòu)建工具见擦,有使用 xml 的 Maven钉汗,也有使用 groovy 的 Gradle羹令,這樣的構(gòu)建工具能夠自動(dòng)處理項(xiàng)目的依賴,很是方便损痰。
-
對(duì)于Python福侈,在依賴管理方面,從一個(gè)初學(xué)者的角度看卢未,嗯肪凛,只能說(shuō)堰汉,貴圈真亂!(本文純屬個(gè)人觀點(diǎn)伟墙,不喜勿噴) 好吧翘鸭,讓我們捋一捋。
在包管理方面戳葵,聽(tīng)說(shuō)現(xiàn)在在役的包管理工具有 distutils就乓、 setuptools、 distribute拱烁、 distlib生蚁、 pip,真讓人眼花繚亂戏自。幸運(yùn)的是邦投,現(xiàn)在貌似有setuptools和pip就已經(jīng)足夠了。
在項(xiàng)目依賴隔離方面擅笔,Python主要使用虛擬環(huán)境志衣,而關(guān)于虛擬環(huán)境的模塊,pyenv剂娄、 venv蠢涝、 virtualenv、 virtualenvwrapper阅懦,也是叫人看到頭皮發(fā)麻和二!
此外,很多 Python庫(kù)使用了 C/C++語(yǔ)言耳胎,即使 Python 只是一個(gè)小版本的更新惯吕,對(duì)應(yīng)的庫(kù)也需要完全重新編譯一次,也就是說(shuō)不同小版本的 Python 的依賴也不一定能兼容怕午。
還有就是版本問(wèn)題(一直認(rèn)為是個(gè)大坑废登!),很多時(shí)候郁惜,我們都希望能用一個(gè)工具來(lái)在兩個(gè)版本間靈活地切換堡距,并分別管理它們的依賴。
雖然存在眾多不足兆蕉,但可以看到的是羽戒,Python依然在往好的方向發(fā)展,比如目前的終極解決方案pipenv虎韵,其出現(xiàn)讓Python的依賴管理逐漸優(yōu)雅和簡(jiǎn)單易稠。下面來(lái)總結(jié)一下我覺(jué)得比較有用的依賴管理工具,希望可以讓和我一樣的初學(xué)者在依賴管理方面少走一些彎路包蓝。
pip
之前我曾寫(xiě)過(guò)關(guān)于pip使用的驶社,pip的基本使用企量。但如果在做項(xiàng)目時(shí),只會(huì)使用pip intall
來(lái)管理包亡电,用久了會(huì)發(fā)現(xiàn)各個(gè)項(xiàng)目的模塊雜揉到一起届巩,很是混亂,還可能會(huì)導(dǎo)致各種奇怪的錯(cuò)誤份乒,因?yàn)閜ip安裝好的模塊全都在一個(gè)全局的模塊庫(kù)中姆泻,無(wú)法實(shí)現(xiàn)項(xiàng)目間的依賴隔離。顯然冒嫡,pip在包管理方面很好用拇勃,但在要隔離項(xiàng)目間的依賴,還需要使用別的工具孝凌,比如virtualenv方咆。
virtualenv
在使用virtualenv處理項(xiàng)目依賴時(shí),我們通常會(huì)使用virtualenv創(chuàng)建一個(gè)虛擬環(huán)境蟀架,再創(chuàng)建一個(gè)依賴包列表requirements.txt瓣赂,然后他們可以使用 pip進(jìn)行安裝。這種方法一般都會(huì)工作正常片拍,但有時(shí)它會(huì)表現(xiàn)出一些怪異行為煌集。下面是其使用時(shí)的一些缺陷。
缺點(diǎn)
你可能得手動(dòng)安裝或刪除某些特定版本的包捌省,并記得定期更新requirements.txt文件苫纤,以保持項(xiàng)目環(huán)境的一致。特別是當(dāng)你想要在你的虛擬環(huán)境中安裝Python包纲缓,但它不一定與項(xiàng)目本身相關(guān)聯(lián)的時(shí)候卷拘。
此外,一些項(xiàng)目有時(shí)會(huì)保留requirements.txt文件的兩個(gè)版本——一個(gè)用于開(kāi)發(fā)環(huán)境祝高,一個(gè)用于生產(chǎn)環(huán)境栗弟,這可能會(huì)導(dǎo)致更多的復(fù)雜性。
Pipenv
不得不說(shuō)工闺,在項(xiàng)目包管理方面乍赫,Python確實(shí)存在不少的坑。直到Pipenv的出現(xiàn)陆蟆,Python的依賴管理才逐漸變得優(yōu)雅起來(lái)雷厂。Pipenv是官方推薦的的python包管理工具,它旨在將所有包管理工具(如bundler, composer, npm, cargo, yarn等)的優(yōu)點(diǎn)集中應(yīng)用于python領(lǐng)域遍搞。
下面是其主要優(yōu)勢(shì):
集成了pip罗侯,virtualenv兩者的功能器腋,且完善了兩者的一些缺陷溪猿。
支持Python2 和 Python3钩杰,在各個(gè)平臺(tái)的命令都是一樣的。
過(guò)去用virtualenv管理requirements.txt文件可能會(huì)有問(wèn)題诊县,Pipenv使用Pipfile和Pipfile.lock讲弄,后者存放將包的依賴關(guān)系,查看依賴關(guān)系是十分方便依痊。
各個(gè)地方使用了哈希校驗(yàn)避除,無(wú)論安裝還是卸載包都十分安全,且會(huì)自動(dòng)公開(kāi)安全漏洞胸嘁。
通過(guò)加載
.env
文件簡(jiǎn)化開(kāi)發(fā)工作流程瓶摆。
總結(jié)
如果需要將庫(kù)安裝到全局系統(tǒng),我們還是需要使用pip性宏;
管理項(xiàng)目依賴方面群井,pipenv是目前的終極解決方案;
如果需要維護(hù)使用virtualenv的項(xiàng)目毫胜,也可以使用pipenv书斜,因?yàn)榧嫒輛irtualenv,并且virtualenv項(xiàng)目可以方便地遷移到pipenv酵使。
最后荐吉, 個(gè)人建議,保持簡(jiǎn)單口渔,擁抱pipenv吧样屠! 關(guān)于Pipenv的使用,可以看一下我的另一篇文章缺脉, Pipenv使用入門(mén)