Python 3 Tutorial 第七堂(1)pip 與 venv


到目前為止,你撰寫的 Python 程式,會是放置在一個資料夾中,也許進一步地在該資料夾下,會建立套件來組織相關的原始碼檔案,然後你在該資料夾中執行程式,然而現在有個問題,如果你拿到另一個人撰寫的檔案,放在另一個資料夾下,該怎麼運用呢?

PYTHONPATH 環境變數

如果我們打算在程式碼中引用某個程式庫,那會是什麼搜尋路徑?Python 的 sys 模組(module)中有個 path 變數,參考了一個 list,當中記錄的字串,就是程式庫模組的搜尋路徑。

你可以設定環境變數 PYTHONPATH,這個資訊會新增在 Python 的模組搜尋路徑中。例如可在 Ubuntu 中如下設定,並進入 Python 互動交談環境中,使用 import sys 匯入 sys 模組,可看到 sys.path 中新增了 PYTHONPATH 設置的路徑:

pip 與 venv

你的模組(.py檔案)或套件,只要是在 sys.path 列出的路徑中,就可以 import 得到,在上例中,可以看到 /usr/lib/python3.5,在 Ubuntu 中,這會放置一些 Python 標準程式庫的 .py 檔案,有興趣的話,可以隨意挑選你感興趣的 .py 來閱讀看看:

pip 與 venv

Python 的第三方套件,通常會安裝到一個 site-packages 目錄,例如 /usr/local/lib/python3.5/site-packages,不過,對於 Debian 系列(包括Ubuntu)的 Linux,通常安裝到一個 dist-packages 目錄,例如 /usr/local/lib/python3.5/dist-packages/,可以參考〈Deviations from upstream〉中的說明。

distutilspip

當然,寫好一個模組或程式庫,需要手動設置環境變數之類的,並不方便,在 Python 標準程式庫中,是有個 distutils,可用來建立與安裝額外模組,適用於簡易的安裝場合,而在過去,有些程式庫也進一步對 distutils 進行了擴充,這些程式庫在發展的過程中,有過一段混亂的時局,像是先有了 Setuptools,而後又有了 Distrubute,然後 Distribute 又回併至 Setuptools … XD

過去無論是安裝 Setuptools 或是 Distribute,都有 easy_install 可以使用,有一陣子都是用它來安裝套件,然而,後來也被 Pip 取代了。

就結論而言,在 Python 2.x 中想要安裝套件,Pip 是 Python 社群目前最建議的方式。而從 Python 3.4 開始也從善如流,開始內建了 Pip!

練習 10:安裝 Pip

如果你是在 Windows 下安裝 Python 3.5,那麼在安裝目錄的 Scripts 目錄中,就會有 pip 指令(建立為一個 .exe 檔案)可以使用,不過,在 Ubuntu 15.04 中,雖然內建了 Python 3.5,不過卻沒有預載 pip,你可以使用以下指令來安裝:

~$ wget https://bootstrap.pypa.io/get-pip.py
~$ sudo python3.5 get-pip.py

安裝完成之後,可以使用 pip3 -V(或 pip3.5 -Vpip -V) 來查看 Pip 的版本:

pip 與 venv

可以執行 pip3 install 並指定套件進行安裝,想移除套件則可使用 pip3 uninstall。例如,若想安裝 Django,可以執行以下指令:

~$ sudo pip3 install Django

以 Django 來說,Pip 會將相關檔案安裝到 /usr/local/lib/python3.5/dist-packages/django/ 之中,若想移除 Django,可以執行以下指令:

~$ sudo -H pip3 uninstall Django

venv

Python 的套件不少都會直接安裝到 Python 預設的一些系統路徑中,像是在方才提到的,Pip 會將 Django 相關檔案安裝到 /usr/local/lib/python3.5/dist-packages/django/ 之中,在初學 Python 的練習過程中,也許會安裝許多套件,如果不想都安裝到系統路徑中,或者不具備系統管理者權限而無法安裝到系統路徑,又或者你需要在多個套件版本之前切換,會希望有個虛擬環境可以使用。

在過去,通常會建議安裝 Virtualenv,用以建立虛擬的 Python 環境,虛擬環境彼此之間互不干擾,也可避免搞亂 Python 主要安裝路徑,而從 Python 3.4 版本開始,也內建了 pyenv 模組,可用來建立虛擬環境。

練習 11:使用 venv

如果你是在 Windows 下安裝 Python 3.5,那麼可以直接使用 venv,然而在 Ubuntu 中,雖然也有 venv 套件,然而預設並沒有安裝 ensurepip 套件(確保系統一定會有 pip),因此,若試著使用以下指令建立虛擬環境時,會出現相關的提示訊息:

pip 與 venv

提示訊息中說明了,你必須先安裝有 python3-venv,由於我們使用的是 Python 3.5,因此執行以下指令進行安裝:

sudo apt-get install python3.5-venv

這麼一來,你就可以使用 python3.5 -m venv myenv 來建立一個虛擬環境,這個環境以目錄為單位,因此會產生一個 myenv 目錄,進入該目錄後,可以用 source bin/activate 啟用虛擬環境,然後在其中用 Pip 做些安裝,胡搞瞎搞一般,使用 deactivate 則可以停用虛擬環境。

pip 與 venv

可以看到,在上圖中,Django 被安裝 lib/python3.5/site-packages 之中。執行 pip3.5 uninstall Django 可以移除 Django,虛擬環境的目錄是獨立的,你也可以自行察看裏頭有些什麼,日後若搞亂了、用不著這個環境或看它不爽快,直接砍了也沒關係。