Macにpython3開発環境を構築する (pyenv導入)
手元のMacbook airにpython3環境を構築したいが、標準で入っている2.x系を変えてしまうのは他にどんな影響が起きるか分からないのでイヤ。 であれば、node.jsのnvmや、rubyのrbenvなどのように、複数バージョンをインストールして切替可能な方法でインストールしたい。
pythonにはそのようなツールとして、pyenvが提供されている。
最初、virtualenvがそういうものなのかと思ったが、virtualenvは文字通り仮想環境を用意するためのもので、 パッケージなどを含めた開発環境を別々に作るためのものなので、ちょっと違うらしい。
(どちらかと言えば両方を合わせて使いたい。)
virtualenvについては別途書くことにする。
とりあえず、まずはpyenvを導入してpython3をインストールする。
このあたりを見てやってみる。
ここで紹介している手順に従うと、以下のようになる。
1. Homebrewをインストール
2. pyenvをインストール
3. pyenvでPython3をインストール
1.Homebrewをインストール
入っていないわけはないので、スキップ・・・と言いたいところだが、この手順で行う前に
$ brew install python3
とやって以下のエラーが発生していたことを思い出し、
Error: Homebrew doesn't know what compiler versions ship with your version of Xcode (8.0). Please `brew update` and if that doesn't help, file an issue with the output of `brew --config`: https://github.com/Homebrew/homebrew/issues
brew update
をしてみろというので、やってみる。
※思えばこれが道を踏み外した瞬間。
$ brew update ==> Migrating Homebrew to v0.9.9 ・ ・ ・
うまく入ったっぽい。バージョン確認もしてみる。
$ brew config HOMEBREW_VERSION: 1.0.7 (略)
2. pyenvインストール
$ brew install pyenv
無事に入ったように見えるので、pyenvコマンドを叩いてみる。
$ pyenv versions dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib Referenced from: /usr/local/bin/bash Reason: image not found Trace/BPT trap: 5
あれ?なんだこれ。
どうも、readline 6 が見つからないと言っているようだ。
※今入っているバージョン
$ brew info readline readline: stable 7.0 (bottled) [keg-only] Library for command-line editing https://tiswww.case.edu/php/chet/readline/rltop.html Not installed From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/readline.rb ==> Caveats This formula is keg-only, which means it was not symlinked into /usr/local. OS X provides the BSD libedit library, which shadows libreadline. In order to prevent conflicts when programs look for libreadline we are defaulting this GNU Readline installation to keg-only.
そしてpyenvの問題かと思っていたのだが、実はもっと影響は大きく、bashですら起動時に同じメッセージで怒られる始末。
面倒なことになってきた・・・。
readlineの修復(readline6.3のインストール)
解決策を探して、似たケースっぽい以下を参考にした。
psqlしたらreadlineのエラーが出るようになって – はらいそ
コレに従って、readline6.3をダウンロード。( http://core.ring.gr.jp/pub/GNU/readline/ )
このダウンロードしたソースを解凍、configure、makeで インストールして brew switch readline 6.3
で切り替えしてみると、
ようやくbash でも pyenv でも起動時エラーが出なくなった。
.bash_profile に以下を追加。
#-- pyenv¬ export PATH="$HOME/.pyenv/shims:$PATH"
3.pyenvでPython3をインストール
ようやく動くようになったpyenvでpython3(この時点の最新:3.5.2)をインストールしてみる。
$ pyenv install 3.5.2 Downloading Python-3.5.2.tar.xz... -> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz Installing Python-3.5.2... BUILD FAILED (OS X 10.11.6 using python-build 20160602) Inspect or clean up the working tree at /var/folders/xw/t3s4g06x3sx4nd1xkdck0r6r0000gn/T/python-build.20161012060445.36527 Results logged to /var/folders/xw/t3s4g06x3sx4nd1xkdck0r6r0000gn/T/python-build.20161012060445.36527.log Last 10 log lines: dyld: Symbol not found: _getentropy Referenced from: /private/var/folders/xw/t3s4g06x3sx4nd1xkdck0r6r0000gn/T/python-build.20161012060445.36527/Python-3.5.2/./Programs/_freeze_importlib Expected in: /usr/lib/libSystem.B.dylib /bin/sh: line 1: 47690 Trace/BPT trap: 5 ./Programs/_freeze_importlib ./Lib/importlib/_bootstrap.py Python/importlib.h make: *** [Python/importlib.h] Error 133 make: *** Waiting for unfinished jobs.... /bin/sh: line 1: 47691 Trace/BPT trap: 5 ./Programs/_freeze_importlib ./Lib/importlib/_bootstrap_external.py Python/importlib_external.h make: *** [Python/importlib_external.h] Error 133
BUILD FAILDだと・・・
再び解決策を探して以下にたどり着く。
osx - Building Python 3 on OS X: [Python/importlib.h] Error 133 - Stack Overflow
最後のコメントに書いてある通り、 xcode-select --install
をすればこのビルドエラーは解消するはず。
こちらにも書いてあった。 しかもGUIのダイアログまで載せてあって、同じ画面を見てとても安心。
$ xcode-select --install xcode-select: note: install requested for command line developer tools
「残り約10秒」になってから10分以上待たされて、もう少しでキャンセルするところだったが、何とか完了。
再度 python3.5.2のインストールを試みる。
$ pyenv install 3.5.2 Downloading Python-3.5.2.tar.xz... -> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz Installing Python-3.5.2... Installed Python-3.5.2 to /Users/username/.pyenv/versions/3.5.2
成功!長かった。。
インストールされたことを確認。
$ pyenv versions * system (set by /Users/username/.pyenv/version) 3.5.2
最後に標準で使うバージョンをsystem → 3.5.2に切り替え。
$ pyenv global 3.5.2 $ pyenv rehash $ pyenv versions system * 3.5.2 (set by /Users/username/.pyenv/version)
これでようやく、pyenvで切替可能な状態で、python3を使えるようになった。