〔教學〕在mac手動編譯同時安裝多個版本的Python

相信大家都知道Mac OS中有內建Python 2.7供一些內建程式使用,然而現在轉用Python 3.x的人已不在少數,我就是其中一個,透過了brew安裝了Python3.6.3,但後來又發現還需要用到3.4.5,這該怎麼辦呢?

今天這篇文章就來教大家要如何用手動編譯的方式在Mac中安裝2個(或更多)版本的Python吧!

Note:其實有一個更好的方法是用Python的虛擬環境,讓電腦裡有好幾個不同的環境能裝不同的Python,不過這邊就先不提這個方法。

(0) 安裝Xcode及 openssl

首先請確定電腦中已安裝Xcode,如果沒有的話請開啟App Store下載Xcode。(這需要一點時間)

完成後,開啟terminal輸入以下指令來安裝openssl:
brew install openssl

等待安裝完畢即可。但如果出現command not found,表示你的電腦中還沒有安裝過homebrew,請先執行下面的指令安裝homebrew再回來安裝:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
(homebrew安裝細節可參考:https://brew.sh/index_zh-tw.html)

(1) 下載你需要的版本


請到Python官網的下載頁(https://www.python.org/downloads/)選擇你要下載的版本點Download,之後拉到最下面下載他的Gzipped source tarball。

(2) 解壓縮


下載完之後,用你的解壓縮軟體解壓它,或著是也可以用下面這行指令解壓縮:
tar -xvzf 檔案名稱 


解壓縮完之後,你應該有看見一個新資料夾了(這邊以3.4.5做教學,因為我有部分的library只支援到3.4不能在我原本的3.6執行):





(3) 編譯Python原始碼並安裝


接下來一步我們要來編譯Python的原始碼,步驟是configure -> make -> make install。

首先我們先來設定configure,開啟terminal,cd到剛剛解壓縮出來的資料夾*:
cd ./Downloads/Python-3.4.5
Note:不知道你在哪裡的話,可以資料夾右鍵->取得資訊->把位置複製起來,貼上就是囉!

接下來執行下面這行指令:
./configure --prefix=/locationtoinstall/ MACOSX_DEPLOYMENT_TARGET=10.12 
其中prefix後面要改成你要安裝的位置

這邊建議你安裝在/usr/local/Cellar/python?/版本
像我是3.4.5,我就會安裝在/usr/local/Cellar/python3/3.4.5:
./configure --prefix=/usr/local/Cellar/python3/3.4.5 MACOSX_DEPLOYMENT_TARGET=10.12 

給他一點時間執行完之後,我們會發現資料夾下多了Makefile檔案:





接下來我們要對Makefile做一點小修改,因為在Python3之後,pip3是預設就會被安裝的,而pip3所需要的openssl,Apple目前已經沒有提供在Xcode中了。

如果直接進行安裝的話,最後你會看到這行錯誤:
Ignoring ensurepip failure: pip x.x.x requires SSL/TLS

這是因為pip安裝需要openssl,但他找不到。不過不用擔心,我們在前面透過brew安裝的openssl這時候就派上用場了!首先輸入這行指令找到我們安裝openssl的位置:
brew --prefix openssl 

你應該會得到像是/usr/local/opt/openssl的位址,把他複製起來。

接下來用你慣用的編輯器(Atom, Sublime, vim, etc...)打開剛剛資料夾新增出來的Makefile檔案,在上面加上這兩行:
export CPPFLAGS=-I/usr/local/opt/openssl/include
export LDFLAGS=-L/usr/local/opt/openssl/lib

注意,如果剛剛你得到的位址跟我不一樣的話,裡面的/usr/local/opt/openssl務必要修正成你自己的!

儲存之後就可以進行安裝了,在terminal輸入這行指令來編譯:
make

完成之後再輸入這行指令來安裝:
make install

安裝需要一點時間,可以去上個廁所,吃個泡麵之類的,大功告成後你應該會發現你指定安裝的位置已經出現了不少東西:


(4) 讓安裝的Python可以在每個地方使用

安裝後你應該會發現在上一部指定的安裝位置中的bin裡面有個python3.4(或你安裝的版本):


我們來試著執行看看吧!
先cd到bin:
cd /usr/local/Cellar/python3/3.4.5/bin

之後輸入:
./python3.4


你應該會發現你成功執行了Python了!但這很麻煩,總不能每次要用的時候都得cd過來吧?來解決這個問題吧!

要如何解決這個問題呢?很簡單!我們只需要建立soft link放到/usr/local/bin就好囉!有些版本的python好像已經先建立好了(即上面圖中的python3, pyvenv等左下角有箭頭的那些),如果已經有的話可以略過下面的指令。

打開terminal輸入下面的指令來建立soft link(檔案名稱請修改成你安裝的版本):
ln -s /usr/local/Cellar/python3/3.4.5/bin/python3.4 ./python3.4_link
ln -s /usr/local/Cellar/python3/3.4.5/bin/pip3.4 ./pip3.4_link
ln -s /usr/local/Cellar/python3/3.4.5/bin/easy_install-3.4 ./easy_install3.4
ln -s /usr/local/Cellar/python3/3.4.5/bin/pyvenv-3.4 ./pyvenv3.4_link


完成之後應該會發現目錄中多了四個檔案(python3.4_link, pip3.4_link.....)。
我們將這些檔案複製,接著貼上到/usr/local/bin,再把這些檔案改成喜歡的名稱就好囉!

這個名稱即未來使用指令時的名稱,如果改名成python3.4,那未來在使用時就是像python3.4 test.py這樣使用,建議用原本的名稱後面加版本號作區別。


大功告成!現在我的Mac裡有系統內建的2.7.10和我自己安裝的3.6.3及3.4.5囉!



參考:
[1] How to Run Multiple Versions of Python at One Time - https://www.agnosticdev.com/content/how-run-multiple-versions-python-one-time
[2] Ignoring ensurepip failure: pip 7.1.2 requires SSL/TLS - Python 3.x & OS X - https://stackoverflow.com/questions/35280956/ignoring-ensurepip-failure-pip-7-1-2-requires-ssl-tls-python-3-x-os-x

留言

這個網誌中的熱門文章

〔旅遊〕秋田縣 田澤湖 單車環湖