為什么需要虛擬環(huán)境?

這也是我在開始學(xué)習(xí)Python時(shí)的一個(gè)困惑,可能能因?yàn)槲耶?dāng)時(shí)知識(shí)碎片化的學(xué)習(xí),一直都是用的非虛擬環(huán)境,當(dāng)看到很多地方只是告訴我們要通過(guò)虛擬環(huán)境來(lái)開發(fā)Python,卻沒(méi)有告訴我們?yōu)槭裁匆@樣做,我的心里就一直有這個(gè)困惑,直到我開發(fā)了兩個(gè)以上的項(xiàng)目,我才意識(shí)到,其實(shí)這一切都基于版本控制(所謂的“環(huán)境”),那么版本控制究竟有多重要呢?
我最開始理解的,我們引用的第三方庫(kù)就像是我們手機(jī)里的各類APP,我們的Python就像是手機(jī)系統(tǒng)。那么Python有新版本了,從3.6升級(jí)到了3.7,又升級(jí)到3.8、3.9,那么我們?cè)谶\(yùn)行新項(xiàng)目的時(shí)候,我們只需要將Python升級(jí)到最新版本,就像我們的iPhone手機(jī)從iOS 6 一年一年地升級(jí)到 iOS 14那么自然!~

然而,現(xiàn)實(shí)情況是,版本的升級(jí),意味著內(nèi)部實(shí)現(xiàn)原理的改變,而這意味兼容性的問(wèn)題。最直觀的例子就是,假設(shè)原先的一個(gè)方法,它的語(yǔ)法完全變了,而這時(shí)候如果你集成了多個(gè)第三方庫(kù),而每個(gè)第三方庫(kù)只支持特定版本及以上的Python特性,兼容性的復(fù)雜程度將成幾何形成長(zhǎng)。這還只是一個(gè)項(xiàng)目,當(dāng)多個(gè)項(xiàng)目引用的雖然是同一個(gè)第三方庫(kù),可是它們依賴的是不同的版本,怎么辦?虛擬環(huán)境就是創(chuàng)建了一個(gè)專屬空間,當(dāng)前項(xiàng)目的所有依賴,都從這個(gè)專屬空間里引用,即 專屬的第三方庫(kù),專屬的指定版本。
專屬空間,才是虛擬環(huán)境的意義所在。

每個(gè)深刻理解版本控制的重要性的開發(fā)者,一定是之前踩過(guò)不少這樣的坑,所以我們哪怕用高中時(shí)學(xué)過(guò)的【控制變量法】也能聯(lián)想到,版本控制的精髓,就是控制版本最好不要變化,如果一定要升級(jí),請(qǐng)同時(shí)測(cè)量所有其他的變量(引用到的第三方庫(kù))是否支持,不會(huì)出現(xiàn)預(yù)期以外的程序BUG!
對(duì)于服務(wù)器的項(xiàng)目尤其重要,因?yàn)樗且粋€(gè)服務(wù)于大量設(shè)備的載體,每天要承接大量的服務(wù),并且有時(shí)它還需要快速移植到其它設(shè)備上,虛擬環(huán)境其實(shí)是提供了一個(gè)方便移植的版本集群的抓手,讓你能夠快速處理那些本來(lái)深度耦合在項(xiàng)目?jī)?nèi)部的第三方庫(kù)。
因此,我推薦使用pipenv來(lái)作為第三方庫(kù)及版本控制工具。它自動(dòng)生成的版本配置文件,可以幫我們省去很多事兒。這個(gè)東西后面搭建時(shí)會(huì)用到,但在此我只會(huì)講簡(jiǎn)單提到,有時(shí)間我會(huì)專門開一篇文章講它的用法,并把鏈接貼到此處。