前言
對於初學者來說,會出現一些環境問題,對於虛擬環境和為什麼使用虛擬環境不是很理解,本文的目的在於解決這些問題。
相關連結:
Python安裝第三方庫提示“既不是內部或外部命令也不是可執行的程式或批處理檔案”解決辦法
一、python和pip命令是如何工作的
首先說說python命令正常工作的原理,以Windows為例,當我們的Python裝好後,可執行程式是一個.exe檔案(其他系統中為其他形式的可執行檔案)。
直接開啟python.exe,就會開啟一個輸入命令的視窗。
但如果我們使用命令列輸入Python,也可以啟用Python的命令列,這是什麼原理呢?
揭曉答案:系統中有一個位置,告訴終端“我知道Python這個程式在哪”。
下面就可以聊一聊環境變數了。
二、環境變數
什麼是環境變數?
想象一個場景,如果你第一次上學,中午打算去食堂吃飯,但又不知道食堂在哪。
你可以自己把整個校園都轉一遍,最終靠自己的努力找到食堂,然後進去吃飯;
當然也可以直接問老師,老師告訴你“在某個路口左轉,步行500米之後到達”。
事實上,計算機也是需要靠“問路”的方式來尋找資源的,所以就存在兩種情況:
使用者自己尋找,找到這個資源放在哪裡,然後讓計算機按照這個路徑執行;
在計算機中放一張“地圖”,地圖中標出了資源的位置,然後計算機只需要看“地圖”,就知道某個軟體放在哪裡。
這張“地圖”,就是環境變數。
實際執行過程中,如果不指定資源的目錄,計算機只會在當前目錄尋找(System32),如果找不到,就去環境變數中尋找。
如果計算機找不到找不到怎麼辦呢,比如輸入Python,計算機找不到和Python有關的任何資源,它就只能提示“既不是內部或外部命令也不是可執行的程式或批處理檔案”了...
環境變數的本質是鍵值對:也就是 變數名 = 路徑。
當Python安裝好之後,就可以選擇,把Python這個軟體加入環境變數,這樣系統就知道Python的家住在C盤的目錄下了。
但是這樣有個小問題在於,
如果不同的專案需要不同的Python版本怎麼辦?
如果不同的專案需要的第三方包互相沖突怎麼辦?
這樣就誕生了一個叫做“虛擬環境”的功能。
三、虛擬環境
對於一般情況,Python和pip命令,他們的路徑永久的寫在安裝目錄下。C:/Program Files/Python3.x/Python.exe
如果想切換版本,最笨的方法就是,安裝多個Python,然後每次手動設定環境變數,但這樣效率太低了。
虛擬環境的作用在於:在全域性的環境變數之外,額外生成一組Python檔案,並且在這個專案中,把環境變數臨時的指向這組路徑,而不再是全域性路徑了。
例如:D:/project/venv/python3.x/python.exe
(venv是Python原生的虛擬環境的目錄)
如果有多個專案,規範的做法是每個專案一個虛擬環境。
這樣,就可以在不影響全域性環境的情況下,對於虛擬環境安裝各種第三方包。
一方面,可以給不同的專案使用不同的Python版本,使各個專案互不干擾。
另一方面,如果虛擬環境出現了各種問題,只需要把它刪了重新建立一個即可,並不會影響其他專案的環境。
四、總結
- Windows中,終端輸入Python的原理是:執行了Python.exe(其他系統為其他形式的可執行檔案)。
- 之所以不需要使用者輸入路徑,是因為系統知道Python.exe在哪。
- 計算機查詢Python在哪,是通過環境變數。
- 為了解決不同版本和不同包的衝突,出現了虛擬環境。
- 虛擬環境建立了另一組獨立的環境,包含Python.exe和pip.exe等檔案。
- 虛擬環境生效的原理是:讓Python的環境變數臨時的指向另外的Python檔案,而不是全域性的環境變數。
後記
對於接觸過前端的同學來說,虛擬環境的功能和NVM一樣,NVM也是用來管理多版本Node.js共存問題的管理器。