記得七、八年前的某天,我在公司樓下的天瓏書局翻著書,旁邊有一對貌似小情侶的年輕人聊著天...
女:「喂,我學校說要教 Python 耶,這裡有 Python 2 跟 Python 3,我要買哪一本比較好?」
男:「廢話,當然是買最新的 Python 3 啊!」
我繼續陰沈的翻著我的書,嘴角微微上揚,心裡 OS:「嗯,你買回去就知道了,你大概連最簡單的 Hello World 都印不出來...」
不就是印個 Hello World 嗎?是能有多難?
要在 Python 2 要印出 Hello, World 字串是這樣寫:
print "Hello, World"
但在 Python 3 卻是這樣寫:
print("Hello, World")
這可不像 Ruby 一樣在呼叫方法的時候可以省略小括號,在 Python 3 使用 Python 2 的 print
寫法,就跟拿明朝的劍斬清朝的官一樣,立馬會跳錯誤訊息給你看:
$ python test.py
File "test.py", line 1
print "Hello, World"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello, World")?
雖然在 Python 2 可以透過「未來模組」來使用來解決部份問題:
from __future__ import print_function
print("Hello, World")
但這總不是長久之計。不只這個 print
變了,包括類別的寫法也有些不同,甚至連整數的除法算出來的答案也不一樣了...
在技術圈,程式語言會不會紅、用的人多不多,除了要看程式語言本身的特性吸不吸引人之外,週邊的生態圈也是很重要的(看看當年的 Ruby 就是被某個叫做 Ruby on Rails 的套件帶紅起來的)。Python 3 雖然功能很優秀,而且早就在 2008 年就已推出,但由於並沒有向下相容,導致兩個版本的社群使用者有些分裂,套件的開發者也選邊站。
現在都已經 2017 年了,根據 Python 官方的 Wiki 的介紹:
所以,就直接選 Python 3 吧。
安裝 Python,最簡單的方式就是直接到官方網站,根據你使用作業系統,下載你喜歡的版本回來安裝。但我這個人因為喜歡亂搞亂玩,可能會拿不同版本的 Python 來做一些實驗,所以接下來將介紹一款名為 pyenv
的版本管理工具。(不是 Git 的那種版本管理)
除了正宗本家的 Python 有許多的版本外,眾多的分支實作品(例如 Ironpython/Jython/PyPy 等),算一算有不少排列組合,如果想要在自己機器上安裝不同版本會有點麻煩,而且萬一亂裝把工作環境弄壞了還得花時間重建。如果是要裝在伺服器上,如果你不是系統管理員,還不一定有足夠的權限可以安裝。雖然使用 VirtualBox 之類的軟體可以模擬作業環境,玩壞了隨時都可以很快的還原或重建一個新的,使用上還是有點麻煩。
如果各位跟我一樣都喜歡玩些新玩具,但又擔心環境被弄髒弄壞,建議可找版本管理工具來管理、切換 Python 的版本,我使用的是 pyenv,這是一款從 Ruby 的 rbenv參考過來改的 Python 版本管理工具。有 pyenv 的幫忙,你可以安心的在電腦裡同時安裝多個不同版本的 Python 而不會搞亂環境,隨時都可以輕鬆的切換想要的版本。
使用 pyenv 不僅不會影響原來系統的設定,由於 pyenv 把程式安裝在你的個人帳號目錄下,所以在安裝過程中不需要管理者(root)的權限就可以安裝其它相關的套件。
如果有 Homebrew 的話,在 Mac 安裝 pyenv 還滿簡單的:
$ brew install pyenv
或是也可按照專案的 README 頁面說明,把整個專案 clone 回到自己的家目錄:
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
最後,別忘了在 Shell 的設定檔加上這幾行設定:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
根據不同的 Shell 會需要編輯不同的設定檔,例如用 ZSH 是編輯 ~/.zshrc
,如果是使用 Bash 則是編輯 ~/.bashrc
。
接著我們來看一些在 pyenv 裡常用的指令。在終端機下輸入 pyenv install --list
會列出目前有哪些可以安裝的列表:
$ pyenv install --list
Available versions:
2.1.3
2.2.3
...略...
2.7.13
2.7.14
3.0.1
...略...
3.6.3
3.6.4rc1
3.7.0a3
3.7-dev
anaconda-1.4.0
anaconda-1.5.0
...略...
ironpython-2.7.4
ironpython-2.7.5
...略...
ironpython-2.7.6.3
ironpython-2.7.7
...略...
jython-2.5.0
jython-2.7.1
...略...
pypy-1.9
pypy3.5-5.9.0
除了正宗本家用 C 語言寫的 Python 之外(又稱 CPython)也有支援許多其它的分支實作品。
如果想要安裝 3.6.4rc1 版本,可以這樣做:
$ pyenv install 3.6.4rc1
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.6.4rc1.tar.xz...
-> https://www.python.org/ftp/python/3.6.4/Python-3.6.4rc1.tar.xz
Installing Python-3.6.4rc1...
python-build: use readline from homebrew
Installed Python-3.6.4rc1 to /Users/eddie/.pyenv/versions/3.6.4rc1
pyenv 會自動找這個版本回來安裝。前面提到可以安裝多個不同的版本,如果你喜歡,也可以再裝個 2.7.14
的版本:
$ pyenv install 2.7.14
安裝完成後,可以使用 pyenv versions
來查看目前電腦裡已經安裝哪些版本的 Python:
$ pyenv versions
* system (set by /Users/eddie/.pyenv/version)
2.7.14
3.6.3
3.6.4rc1
前面那個星號表示目前是使用 system
,也就是系統內建的 Python。你可以在終端機下輸入這個指令,看看目前 Python 的版本:
$ python --version
Python 2.7.13
如果要切換到其它版本的 Python,例如想要切換到 3.6.3 版本:
$ pyenv global 3.6.3
再來看一下 Python 的版本:
$ python --version
Python 3.6.3
這樣就切換到 3.6.3 版了,相當便利!
除了 global
的用法,也可針對每個不同的目錄設定不同的版本。例如有個叫做 python-demo
的目錄,在該目錄下執行:
$ pyenv local 3.6.3
這個指令會在該目錄做出一個名為 .python-version
的檔案(檔案的內容就是寫著要使用的 Python 版本):
$ ls -al
total 8
drwxr-xr-x 3 eddie wheel 102 Dec 21 05:09 .
drwxrwxrwt 55 root wheel 1870 Dec 21 05:08 ..
-rw-r--r-- 1 eddie wheel 6 Dec 21 05:09 .python-version
下回當進到這個目錄的時候就會自動切換到這個版本,離開後又會變回 global
指定的版本:
# 目前版本 2.7.14
$ python --version
Python 2.7.14
# 進入該目錄
$ cd python-demo
# 版本自動切換
$ python --version
Python 3.6.3
# 離開該目錄
$ cd ..
# 又切回原本的 2.7.14 了
$ python --version
Python 2.7.14
如果想移除某個版本的 Python 可使用 uninstall
指令:
$ pyenv uninstall 3.6.4rc1
這樣就可以把 3.6.4rc1
版本移除掉了。如果是整個 pyenv 都不想要了,只要把個人目錄底下的 .pyenv
目錄整個移除,就會整個清潔溜溜了,完全不會動到系統內建的 Python。
你也許會好奇為什麼 pyenv 可以這麼神奇的切換 Python 的環境,其實在前面的安裝過程就稍微有露餡了:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
這三行設定的前兩行,就是把 pyenv
的路徑硬是塞在系統 Python 的路徑前面,最後一行的 pyenv init
則是啟動這個「墊片」的功能。
當你在終端機底下敲打 python
六個字並按下 Enter 鍵時,原本系統的 Python 的路徑 /usr/bin/python
因為在 PATH 的比較後面的位置,所以系統只會先找到 pyenv 墊片的 Python 版本(也就是說,原來系統的 Python 被鬼摭眼啦)。
其實在 Ruby 世界也有一款叫做 RVM 的版本管理工具,它也是透過類似的手法達到這個目的。
大概就是這樣,咱們下回見!