2017年7月16日 星期日

在 Eclipse 使用 Python 虛擬環境開發 Python

最近再度開始學習 Python,然後看到不少 Python 套件的官方文件提到虛擬環境
因此來紀錄一下,以 Java 開發者的角度來看 Python 虛擬環境相關的基本知識。

虛擬環境是什麼?為什麼 Python 需要虛擬環境?

其實這個問題是我最開始看到這個東西,馬上就產生的疑問。
雖然談到虛擬環境,估計大概就像為何人們會使用 Docker 是差不多的問題
所以疑問雖然產生了,但也不是一個無法想像原因的事情。
不過在 Windows 上亂看資料夾時,突然注意到 Script 這個資料夾的變動,才更加地理解了這個問題。

在 Windows 上,Python 安裝了以後,會在安裝目錄裡跑出一個 Script 資料夾
裡面會包含 Python 相關的執行檔,例如 python.exe、pip.exe、easy_install.exe 等等
因此在把這個資料夾放入 Windows 的環境變數後,才能在命令提示字元等地方以 python 或者 pip 這些指令去執行 python 的程式。

接著,當我們用 pip 或者 easy_install 這些套件管理工具去安裝了某個套件以後,那個套件就會被放進 Script 資料夾。
這是什麼意思呢?這其實就像是最初在學習 Java 時一樣~。
最開始在用 Java 時,要使用某個別人寫好的套件,要先下載那個套件編譯的 Jar
然後我會直接把那個 Jar 放到 JRE 的資料夾,也就是例如 .…\jre1.8.0_111\lib\ext 這個資料夾。
在 Python 裡,Script 資料夾差不多就是一樣的用途,把安裝的套件都放在這裡。
而這時,Java 會有的問題,當然也就同樣會出現在 Python 上了。

在 Java 中,如果有某個套件的 Jar,同時放了兩個不同版本的 JAR 在 \lib\ext 裡
實際執行程式並且引用該套件時,會因為無法保證 JVM 會載入到哪個版本,因此導致有時候程式可能會出錯
例如會出現 ClassNotFoundException 或者 ClassDefNotFoundException 這類的錯誤。
而在 Python 中,同樣的問題也會發生,也就是套件版本也一樣會衝突。
但在 Java 中,可以透過 Maven/Gradle 這種套件管理的架構來解決,Python 卻不行
(Java 可以但 Python 不行的原因,應該是在於因為 Java 有中繼檔 JAR/WAR 這種結構)
因此最後 Python 對於這種問題的解決方法,就是創造虛擬環境,以隔離不同的執行環境。
就像是開頭說的,這個問題其實就跟 Docker 是差不多的問題。

在 Eclipse 中如何使用虛擬環境?

Eclipse 在安裝 PyDev 之後,可以指定 Python 的 Interpreter 的位置。
而 Python 虛擬環境在建立時,會產生一個幾乎跟 Python 安裝目錄一模一樣的資料夾結構
因此要在 Eclipse 使用某個 Python 虛擬環境,其實很簡單
只要先在 Eclipse –> Windows –> Preferences –> PyDev –> Interpreters –> Python Interpreter 裡
建立一個新的 Interpreter,然後路徑指向那個建立出來的 Python 虛擬環境即可。
之後在新建 PyDev 專案時,Interpreter 就指向這個新的 Interpreter,PyDev 就能夠正常地使用這個虛擬環境了。

沒有留言: