Introduction

一個開發環境包含「程式語言執行環境」、「開發/編輯環境」、「第三方套件」。可能會存在版本或是專案上的差異,因此常見的管理工具有以下:

  • Anaconda 集成式開發軟體
  • PIP 套件管理工具
  • Pyenv 多版本Python管理工具
  • Virtualenv 虛擬環境

環境管理一直都是開發者初期很容易踩的坑,舉凡像是套件裝不起來啊,不同作業系統支援的程度不同等等的。其中,套件安裝是常出現的問題之一。在初期程式的套件安裝流程通常是: 從套件開發者的網站下載套件 -> 存在你電腦當中的某個位置
-> 在程式中手動指定套件位置在哪裡。整個流程很像我們以前從「史萊姆的第一個家」下載小遊戲的做法。但隨著版本的更新,你的電腦中可能會存放多個不同版本的相同套件,分散在各地提供不同的程式使用。

為什麼需要套件環境管理?

但是在傳統的套件管理中,會有幾個問題出現:

  • 如果你的專案使用想使用與系統不同版本的話怎麼辦?
  • 如果你有多個專案,每個專案都有各自需要的版本及特定的套件?
  • 擔心隨便升級或修改系統自帶的 Python,會遇到一些權限上的問題?

所以,身為一個開發者來說,我們會想要讓我們的環境上可以支援不同的 Python 版本,每個專案也有用有自己的套件環境。專案環境彼此獨立,開發也不容易出現互相干擾衝突的情況。網路上有許多解決方案,以下是列出我自己比較習慣的一種環境配置的方式。我是利用 Pyenv 搭配 Virtaulenvwrapper 。

pip

 
pip 是一款 Python 的套件管理工具(就像 JavaScript 有 npm , Ruby 有 gem , PHP 有 Composer 一樣)。可以使用它來安裝需要的套件,而不用每一個套件都各自下載,放在專案資料夾底下。一般的安裝 python 的時候都會帶上 pip ,除非是系統自帶的才需要另外安裝。簡單來說,套件管理工具就是一個替開發者下載、保存第三方套件,在程式中可以載入使用

1
2
3
4
5
6
7
8
$ pip -V # 查看 pip 的版本,及對應的 python 版本
$ pip install -U pip ## 更新 pip

$ pip list # 列出所有安裝哪些套件
$ pip search package # 搜尋相關套件
$ pip install package # 安裝套件
$ pip uninstall package # 移除套件
$ pip install --upgrade package # 升級套件

對 pip 更多使用方法有興趣的話,可以參考另外一篇文章

Virtualenv & Virtaulenvwrapper

Virtualenv 是 Python 的一種虛擬環境的套件,我們可以用它來創建獨立的python 環境。這樣的話,就可以同時建立多個虛擬環境,每個環境裡面的python 使用不同的版本,並且環境之間相互獨立。 Virtaulenvwrapper 是基於 Virtualenv 的操作工具,提供更方便操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装
$ pip install virtualenv
$ pip install virtualenvwrapper

## 環境配置
$ mkdir $HOME/.virtualenvs # 建立放置虛擬環境的目錄
$ export WORKON_HOME=$HOME/.virtualenvs
$ source /usr/local/bin/virtualenvwrapper.sh
# 可以把上面這兩句加到 ~/.zshrc 或是 ~/.bash_profile 中,不然就要每次都設置一次

## 使用
$ mkvirtualenv envName # 建立一個跟目前環境相同的 Python
$ mkvirtualenv --no-site-packages envName # 建立一個跟沒有任何套件的 Python 環境
$ lsvirtualenv 或 workon # 查看目前有的虛擬環境
$ workon envName # 切換到某個虛擬環境
$ deactivate # 退出某個虛擬環境
$ rmvirtualenv envName # 退出某個虛擬環境

Pyenv

Pyenv 是 Python 的版本管理工具,可以在同一台電腦上安裝不同版本,並可以任意切換。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 安裝
$ brew install pyenv # pyenv 並不是 python 的套件,所以要透過的是 OS 來安裝而不是 pip。

## 環境配置
$ if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
$ export PYENV_ROOT=/usr/local/var/pyenv
# 可以把上面這兩句加到 ~/.zshrc 或是 ~/.bash_profile 中,不然就要每次都設置一次

## 使用
$ pyenv versions # 查看目前所有安裝的版本, system 是系統原本就安裝的,如果使用 brew 安裝的也會被放在 system
$ pyenv install 3.5.2 # 安裝 3.5.2 版本的 python
$ pyenv rehash # 重新載入
$ pyenv local 3.5.2 # 告訴系統現在的資料夾下要使用這個版本
$ pyenv local 3.5.2 --unset # 告訴系統現在的資料夾下不要使用這個版本
Pye

Pyenv 結合 Virtaulenvwrapper

有了 Pyenv 跟 Virtaulenvwrapper,我們就可以根據不同的專案需求針對不同的 Python 建立自己的虛擬環境。大致流程是這樣:先利用 Pyenv 安裝/切換到特定版本 -> 安裝 Virtaulenvwrapper -> 開啟虛擬環境 -> done!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 安裝/切換到特定版本
$ pyenv install 2.7.10
$ pyenv rehash
$ pyenv local 2.7.10


## 安裝 Virtaulenvwrapper
$ pip install virtualenv
$ pip install virtualenvwrapper

## 開啟虛擬環境
$ mkvirtualenv py2dev

## 退出回到系統環境
$ deactivate
$ pyenv local --unset 2.7.10

重複一次,就可以建立不同版本的虛擬環境了:

Reference

[1] 深入对比数据科学工具箱:Python和R之争
[2] 如何使用 Python 學習機器學習(Machine Learning)
[3] 数据科学界华山论剑:R与Python巅峰对决
[4] Django筆記 - Python的模組與套件
[5] Mac多Python版本共存,多个独立Python开发环境切换。


License


本著作由Chang Wei-Yaun (v123582)製作,
創用CC 姓名標示-相同方式分享 3.0 Unported授權條款釋出。