[心得] pyenv + Py3.4 + numpy 在 OSX 10.9
先前有朋友提到怎麼樣在 mac 設定 Python 科學計算環境,
雖然有 anaconda 或用官方 dmg 安裝的方式,這邊提供的是
透過 Homebrew + pyenv 來做多個獨立 Python 版本的控制。
==============================
= 給不想看說明文的快速安裝法 =
==============================
在全新安裝的 Mac OSX 10.9 Mavericks 上測試,使用 BASH。
安裝 Python 3.4.0 與 Numpy 1.8
# 安裝 Xcode command line tool,已安裝可跳
xcode-select --install
# 安裝 Homebrew,已安裝可跳
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
brew doctor # 測試 homebrew 是否有問題
brew install `brew deps python3` # 安裝 Python 相依套件
vim ~/.bash_profile # 新增 pyenv 環境。新增以下內容
# For pyenv
export PYENV_ROOT=/usr/local/opt/pyenv
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv > /dev/null; then eval "$(pyenv init -)"; fi
source ~/.bash_profile # 使用上面定義好的設定檔
brew install pyenv # 安裝 pyenv
pyenv install 3.4.0 # 安裝 Python 3.4.0 setuptools 3.1 pip 1.5
brew tap Homebrew/python
brew tap homebrew/science
pyenv local 3.4.0 # 僅在本目錄下以 3.4 作為預設版本
pip3 install nose # Numpy 測試用
brew install `brew deps numpy` # Numpy 相依套件
pip3 install numpy
python3 -c "import numpy; numpy.test()" # 測試 numpy 安裝
========
= 說明 =
========
細節可以參考 https://github.com/yyuu/pyenv 的說明。
他同樣可以搭配 pyenv-virtualenv 使用。
如果之前有使用過 brew install python3 之類的方式安裝的話,
對 pyenv 來說,這是 system 的設定,所以想要停用 pyenv 的版本話
pyenv [global|shell|local] system
就會換回去了,global/shell/local 差別在這個更動適用到全系統還是這個環境等。
我自己的測試情況是不會有衝突。
不過需要特別注意的是,brew install numpy 這會安裝給 brewed 版本的 python
即便使用了 pyenv global 3.4.0 行為仍舊一樣。
brew deps xxx 會把 xxx 相依的套件列出,我自己是偏好用 brew 管理套件,
雖然說,不裝 pyenv 似乎也會去下載需要的 source,但我並沒有測試這部份。
如果照上面方式設定的話,並不會跑到預設的 ~/.pyenv 底下,
而是到 homebrew 常用的 /usr/local/opt/pyenv 底下,
不喜歡可以這個路徑改掉。
pyenv 會對經常要切換測試不同 python 版本的人來說,更為方便
搭配 virtualenv 就可以隔離出不同的套件群。
如果是使用 fish SHELL 的話,預設設定檔路徑在 ~/.config/fish/config.fish
設定檔要加入
# Update PATH for homebrew
set -x PATH /usr/local/bin $PATH
# For pyenv
set -x PYENV_ROOT /usr/local/opt/pyenv
set -x PATH $PYENV_ROOT"/bin" $PATH
if begin; status --is-interactive; and type -f pyenv > /dev/null; end
. (pyenv init -|psub)
end
記得把 brew install `brew deps numpy`
改成合法的語法 brew install (brew deps numpy)
====================
= Link brewed libs =
====================
OS X 提供的 OpenSSL, SQLite3 版本都蠻舊的,也許你會想連接新的版本,
而且預設是用 gcc 來編譯,跟 brewed python 用 clang 不同。
如果想要仿造 homebrew 設定的話,在 pyenv install 前加上
brew install sqlite
brew install openssl
export CONFIGURE_OPTS="CC=clang"
export CFLAGS="-I/usr/local/opt/openssl/include"
export CFLAGES="$CFLAGS -I/usr/local/opt/sqlite/include"
export LDFLAGS="-L/usr/local/opt/openssl/lib -L/usr/local/opt/sqlite/lib"
pyenv install 3.4.0 # 已知 2.x 版會失敗
失敗的話,可以強制 link 到 /usr/local 並且把 FLAGS 設定修改成
brew link --force sqlite openssl
export CFLAGS="-I/usr/local/include"
export LDFLAGS="-L/usr/local/lib"
可以用以下的命令來測試連結的 lib 是不是要的版本
`pyenv prefix 3.4.0`/bin/python -c \
"import ssl; print(ssl.OPENSSL_VERSION)" # OpenSSL
`pyenv prefix 3.4.0`/bin/python -c \
"import sqlite3 as s; print(s.sqlite_version_info)" # SQLite3
=========
= Numpy =
=========
有人可能會連結到 Intel MKL,最常的問題是不知道連到哪個 BLAS lib
python -c "import numpy as np; np.__config__.show()"
==============
= virtualenv =
==============
由於 Python 套件常常有相依的狀況,為不同專案就可以使用 virtualenv
來獨立出一個環境,每個 virtualenv 互相獨立不干擾。十分方便。
pyenv 的作者貼心寫了 pyenv-virtualenv 以及 pyenv-virtualenvwrapper
這看官網的說明就會使用了。
這邊主要是補充比較 tricky 的部份。我自己是用 fish shell + virtualfish,
建立一個新的環境,使用特定版本的 Python 指令如下:
vf tmp -p (pyenv prefix 3.4.0)/bin/python3
pip install .......
vf deactivate
我初次使用竟然不成功,後來發現是 virtualenv 版本太舊的關系
請升級至 1.11+ 就沒有問題。討論可見
https://github.com/pypa/virtualenv/issues/463
與 3.4 有關
歡迎大家指教~
--
============================================
= PyCon APAC 2014, May 15-18 @中研院人社館 =
============================================
如果對 Python 在科學計算上有什麼有趣的進展/研究/套件,
都很歡迎各位參加 PyCon APAC 2014!
大家有興趣可以參考官網
http://tw.pycon.org/2014apac/zh/
也歡迎來 PyConTW FB 粉絲頁按個讚!
https://www.facebook.com/pycontw
如果你也想為 Python 社群盡一份力量,我們也在徵求志工朋友!歡迎站內信!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.129.5
推
02/03 14:06, , 1F
02/03 14:06, 1F
EDIT: 增加 fish 的設定,以及 virtualenv 相關介紹
推
02/11 22:24, , 2F
02/11 22:24, 2F
EDIT: fix typo, which pyenv --> command -v pyenv (thanks concise!)
EDIT: fix pyenv not found detection in fish
EDIT: use brewed openssl and sqlite3 in pyenv, add get numpy info
EDIT: 3.4.0 released!
※ 編輯: ccwang002 來自: 140.112.25.107 (03/17 16:35)