知識の引き出し

獲得した知識は、使えるように引き出しに整理してしまっておこう。

Macにpython3開発環境を構築する (pyenv導入)

手元のMacbook airにpython3環境を構築したいが、標準で入っている2.x系を変えてしまうのは他にどんな影響が起きるか分からないのでイヤ。 であれば、node.jsのnvmや、rubyのrbenvなどのように、複数バージョンをインストールして切替可能な方法でインストールしたい。

pythonにはそのようなツールとして、pyenvが提供されている。

最初、virtualenvがそういうものなのかと思ったが、virtualenvは文字通り仮想環境を用意するためのもので、 パッケージなどを含めた開発環境を別々に作るためのものなので、ちょっと違うらしい。

(どちらかと言えば両方を合わせて使いたい。)

virtualenvについては別途書くことにする。

とりあえず、まずはpyenvを導入してpython3をインストールする。

このあたりを見てやってみる。

理系じゃないけどMacに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のダイアログまで載せてあって、同じ画面を見てとても安心。

coderoid.hatenablog.com

$ 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を使えるようになった。