iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 2
0
Software Development

為你自己學 Python系列 第 2

[Day 2] 說書,從 Hello, World 說起

說書,從 Hello, World 說起

記得七、八年前的某天,我在公司樓下的天瓏書局翻著書,旁邊有一對貌似小情侶的年輕人聊著天...

女:「喂,我學校說要教 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 年就已推出,但由於並沒有向下相容,導致兩個版本的社群使用者有些分裂,套件的開發者也選邊站。

所以,現在是要 2 還是 3?

現在都已經 2017 年了,根據 Python 官方的 Wiki 的介紹:

  1. Python 2 系列不會再加新功能,目前只有維護,並且只會維護到 2020 年。
  2. 許多知名的套件也都有 Python 3 版本了。

所以,就直接選 Python 3 吧。

安裝

安裝 Python,最簡單的方式就是直接到官方網站,根據你使用作業系統,下載你喜歡的版本回來安裝。但我這個人因為喜歡亂搞亂玩,可能會拿不同版本的 Python 來做一些實驗,所以接下來將介紹一款名為 pyenv 的版本管理工具。(不是 Git 的那種版本管理)

使用 pyenv 來管理 Python 版本

除了正宗本家的 Python 有許多的版本外,眾多的分支實作品(例如 Ironpython/Jython/PyPy 等),算一算有不少排列組合,如果想要在自己機器上安裝不同版本會有點麻煩,而且萬一亂裝把工作環境弄壞了還得花時間重建。如果是要裝在伺服器上,如果你不是系統管理員,還不一定有足夠的權限可以安裝。雖然使用 VirtualBox 之類的軟體可以模擬作業環境,玩壞了隨時都可以很快的還原或重建一個新的,使用上還是有點麻煩。

如果各位跟我一樣都喜歡玩些新玩具,但又擔心環境被弄髒弄壞,建議可找版本管理工具來管理、切換 Python 的版本,我使用的是 pyenv,這是一款從 Ruby 的 rbenv參考過來改的 Python 版本管理工具。有 pyenv 的幫忙,你可以安心的在電腦裡同時安裝多個不同版本的 Python 而不會搞亂環境,隨時都可以輕鬆的切換想要的版本。

使用 pyenv 不僅不會影響原來系統的設定,由於 pyenv 把程式安裝在你的個人帳號目錄下,所以在安裝過程中不需要管理者(root)的權限就可以安裝其它相關的套件。

安裝 pyenv

如果有 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 裡常用的指令。在終端機下輸入 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 切換版本的運作原理

你也許會好奇為什麼 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 的版本管理工具,它也是透過類似的手法達到這個目的。

大概就是這樣,咱們下回見!


上一篇
[Day 1] 序曲
系列文
為你自己學 Python2
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言