Django, Python

建立Python的虛擬環境

Python之所以這麼受到大家的歡迎,其中一個主要的因素是因為有非常多好用的模組及套件可以直接從網路上下載使用,事實上,一個有趣實用的Python專案,裡面通常都會使用到許多別人已經開發好的模組和套件,大家其實都是把自己的專案建立在其它大神的專案基礎上,累積先人的智慧結晶建立更多有趣的應用程式。

但是,同學們有沒有想過,如果在一台電腦中每開發一個Python的專案就會安裝數量不等的模組或套件,當開發的專案不斷地增加之後,在我們的電腦中不就充滿了各式各樣的模組及套件?那如果有兩個專案所使用的模組或套件需要的版本不一樣,那要如何處理?另外,當我們需要把專案打包給別人使用的時候,我又該如何知道這個專案使用了哪些套件或模組?

為了避免上述的問題,Python生態系發明了一種叫做「虛擬環境」的機制,讓我們在開發專案的時候,一開始先建立一個乾淨的環境,並設定在這個環境中日後如果有要安裝什麼新的套件或模組時,這些套件或模組需要放置的地方。每一個不同的虛擬環境放置套件及模組的地方都不一樣,只要每一個專案都有自己的虛擬環境,就不會出現不同專案之間套件及模組混亂的問題。

在Python中如果要在命令提示字元環境中建立虛擬環境,習慣上最常用的是virtualenv這個命令,仍然這個命令也是Python的一個套件,因此在使用之前,需要以如下所示的命令先安裝:

pip install virtualenv

安裝完成之後,即可在命令提示字元下,執行以下的命令建立一個虛擬環境(在此以venv為例):

virtualenv venv

有些同學的系統無法使用virtualenv,也可以不需要安裝virtualenv,而是使用以下的指令直接產生虛擬環境(以下的指令只有在virtualenv無法安裝及執行的情況才需要使用):

python -m venv venv

如果上述指令可以順利執行,virtualenv就會在目前的工作目錄之下建立一個叫做venv的子目錄,此虛擬環境的名稱即為venv,如果沒有產生此目錄的話,那表示虛擬環境並沒有成功被建立。當順利建立venv虛擬環境之後,還要進入此環境才能夠生效,進入此虛擬環境的方法如下 (以Windows為例):

venv\Scripts\activate

如果是MacOS或是Linux作業系統的話,則是以如下所示的指令進入虛擬環境(請留意符號上的不同):

source venv/bin/activate

進入虛擬環境之後,在命令提示的地方就可以從前面的括號內容瞭解目前所處的環境名稱:

(venv) C:\Users\skyne>

如果你是在Anaconda的環境之下,還會多看到一個Anaconda自己的虛擬環境,這是正常的情況:

(venv) (base) C:\Users\skyne>

初次進入此虛擬環境,可以利用以下的指令檢查目前的模組及套件安裝的狀態:

pip list

初次執行的情形應如下圖所示:

如上圖所示,全部只有3個模組而已。上圖下方的黃色文字只是提醒我們pip的版本可以更新,但是沒更新也沒有關係。

之後,當我們為專案安裝不同的模組時,每一個模組就會老老實實地待在這個環境中,例如我們在環境中以pip install numpy安裝了知名的數值計算模組之後,再一次pip list,看到的內容就會不一樣了。

那麼之後如果我們這個專案打算要傳給別人使用,該如何表示我們這個專案用也哪些模組呢?習慣上我們會利用以下的指令建立一個叫做requirements.txt的檔案:

pip freeze > requirements.txt

然後把requirements.txt這個檔案隨著專案傳給別人,要使用這個專案的人,在執行此專案之前,只要再利用以下的指令,就可以一口氣把此專案所有用到的模組全部安裝到自己的虛擬環境中了。

pip install -r requirements.txt

那麼,自己的虛擬環境需不需要也一併複製給別人呢?答案是否定的,不用喔。

為什麼呢?因為每個人的作業系統環境都不一樣,自己的虛擬環境通常只適用在自己的電腦中,為了維持專案最大的相容性,並不需要也不適合把自己的虛擬環境提供給別人使用,在Python專案中,只要有requirements.txt敘明本專案所有使用到的模組和套件就可以了。

最後,該如何離開虛擬環境呢?以下的指令即可達成:

deactivate

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s