1. 程式人生 > >[python] venv 模組 -- 建立虛擬化的專案環境

[python] venv 模組 -- 建立虛擬化的專案環境

在使用 python 製作網頁的過程中,我們往往需要先將站點的目錄“虛擬化”。虛擬化其實就是將當前檔案下程式的執行環境與整個系統的環境隔離。那麼為什麼我們要將一個專案虛擬化呢?

1.不進行虛擬化會產生的問題

在平時使用 python 時,有可能會遇到這幾個常見的問題:

1.當執行的專案處於不同版本時(如 python 2.7/3.7 ),要通過切換 python 直譯器的版本來執行程式(或要使用 python2/3 pip/pip3 等指令來對應不同的版本)。

2.有時做一個專案要用到許多第三方模組,但是其他專案基本不會用。如果直接 pip install 到系統中,專案刪除後清除安裝過的模組會很麻煩。

3.做完一個專案後,你希望能夠不再一次安裝它依賴的模組,就能在另外一個系統上直接執行。

4.你的專案暫時執行在一箇舊版的第三方模組上,而新版的第三方模組不相容你所寫的程式。你既希望能夠讓原來的專案在舊版本上繼續正常執行,又希望能夠在另一個專案中使用新版本。

如果你遇到過上面這四個問題,並且希望能夠改善這一些繁瑣的配置過程,那麼你就可以嘗試對你的專案進行“虛擬化”。

2.建立一個虛擬化專案

python 自帶了一個非常簡便的虛擬化模組 - venv 。在 python 3.5 及之前的版本,建立一個虛擬化專案的指令為:

$ python -m venv <directory>

而在 3.6 之後的版本中,指令變成了

$ python3 -m venv <directory>

其中在 3.4 及之前的版本中,初始化一個環境是不會自帶 pip 的。而在 3.4 之後,可以新增 --without-pip 這個引數來去掉 pip 包。

當然,venv還有 --copies 引數,它就可以在建立時把系統已有的模組複製進去。不過一般這個不常用。(因為系統裡裝的模組可能已經很多了)如果真的要使用系統中的模組,請參考第四小節的設定。

3.進入/退出虛擬化環境

成功建立了虛擬化的環境之後,我們需要先進入這個環境(不然 pip 還是會裝在系統中)。我們可以使用以下指令來進入環境。其中 <venv>

是你專案資料夾的路徑。

  • MacOS 或 Linux

    • bash/zsh $ source <venv>/bin/activate

    • fish $ . <venv>/bin/activate.fish

    • csh/tcsh $ source <venv>/bin/activate.csh

  • Windows

    • cmd.exe C:\> <venv>\Scripts\activate.bat

    • PowerShell PS C:\> <venv>\Scripts\Activate.ps1

cometeme$ source /Users/cometeme/Documents/example/bin/activate
(example)cometeme$

可以看到前面多了一個(example)的提示,說明我們已經進入到虛擬環境中了。在虛擬環境裡,我們可以像正常一樣操作裡面的檔案,或是安裝第三方模組,只不過這一些都只會影響到本地的內容了。

當我們想要退出虛擬環境時,我們可以輸入 deactivate 這個指令來退出。

4.設定虛擬環境

在虛擬環境的根目錄下,我們可以看到一個叫 pyvenv.cfg 的檔案。用文字編輯器開啟後可以看到這幾行內容:

home = /Library/Frameworks/Python.framework/Versions/3.7/bin
include-system-site-packages = false
version = 3.7.0

其中, home 指的是系統中 python 模組的安裝位置。除非你自定義過了,不然這個預設值就是對的。

include-system-site-packages 這個引數可以設定是否開啟“引用系統中的模組”的功能。如果開啟了,那麼當你就可以直接使用系統中已經裝過的第三方模組。(但是你在虛擬環境下裝的模組就不能被其他地方的程式使用)

version 可以指定 python 的版本,前提是你必須要安裝這個版本。(比如你只裝了 python3.6 ,那麼你設定成 2.7 就會出錯)

結語與其他文件

大約一千多字, venv 的這個模組的一些簡單使用方法就已經介紹完了,簡潔卻又方便,這一直是 python 的特性。其實除了可以在控制檯中使用外,它還可以作為一個模組在程式中使用。不過一般情況下我們只需要用控制檯就可以了。如果大家還想深入研究,可以檢視 29.3. venv — Creation of virtual environments