Mac へ anaconda をインストール。pyenv と homebrew を使って。

python を使う授業があったので履修してみることにした。

履修人数が多いので簡単に管理できるよう,Anaconda という開発環境含めて一括で管理できるものを使うらしい。

Mac への Anaconda の導入方法を調べた。
OS: macOS High Sierra (バージョン 10.13.6)

調べた背景

しかし私の mac には,デフォルトで入っていた python2.7, Homebrew で入れた python3.6 が既にあり,
ただ python とだけ打つとpython2.7 が,python3 と打つと python3.6 が,立ち上がる状態となっている。

授業ではLinuxにただダウンロードしてただインストールしていたが,このMacに同様に Anaconda を入れても大丈夫なのだろうか。

結論から言うと,pyenv で使い分けられるので Homebrew で入れた python3.6 を消す必要はない。
適当に調べたら,Homebrew で先に入れた python3 と Anaconda 上の python3 とが干渉するかどうかなどということを試している人は居なくて,環境を気にする必要のある人はそもそも何らかの方法を使ってpython のバージョンを切り替えられるようにしているらしい。その一つの手段がpyenvらしい。

とはいえ、もっと調べていくと, Homebrew と Anaconda とが (config ファイルの関係で?)ぶつかり合うらしい。
Anacondaを入れたらHomebrewの環境が吹っ飛んだ話 - Qiita
それは厳しい。もしぶつからせてしまうとHomwbrewの設定が壊れて path の設定もしなおさなきゃ、と。厳しい世界だ。。。

ということで,Anaconda が Homebrew の config ファイル群や path を壊すらしい?のを回避できる方法を調べた。

検索でよく引っかかったやり方は,

Homebrew で pyenv を入れた後,
pyenv で Anaconda をインストールし,
Anaconda のバージョン含め pyenv で管理する。

というもの。*1

これを主に参照してそのような理解に至った。
MacにAnacondaでPythonの開発環境を構築してみる


詳しくはこれらのブログにもお世話になった。
pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法 - Qiita
MacでおすすめのPython環境作成方法 – CodeAid(コードエイド)

Homebrew を用いて, pyenv をインストール

Homebrew が入っているなら,ターミナルに

% brew install pyenv

を打ち込めば終わり

ちなみに,
MacにAnacondaでPythonの開発環境を構築してみる
にあった pyenv のインストール方法のところにあった以下の path の設定は,私は必要なかった。ので取り消し線。
#パスを通す
% echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile brew で pyenv を入れたなら設定済なのでそもそも要らない
% echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile 上に同じ

#pyenv の初期化?((これを二重にすると brew 使う時になんか言ってきた。でもこれしないと pyenv がスムーズに使えない。1回言おう。))
% echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
% source ~/.bash_profile

私は ~/.bash_profileではなく、 ~/.zshrc に書き込みました。

eval "$(pyenv init -)"

pyenv を用いて Anaconda をインストール

pyenv は環境管理ソフトなので複数の仮想環境を作ることができる。
が,ここではただ Anaconda を Homebrew の python と干渉させずにインストールしたいだけなので,1つの環境を作ることに絞って書く。

インストールできるものの一覧を表示。(・・・は省略)

% pyenv install -l
Available versions:
  2.1.3
  ・・・
  3.6.5
  ・・・
  anaconda-1.4.0
  ・・・
  miniconda-latest
  ・・・
  stackless-3.5.4

python, anaconda 以外にも色々入れられるらしい。

ここでは Anaconda の中で最新だった anaconda3-5.1.0 をインストールした。

% pyenv install anaconda3-5.1.0

インストールできたことの確認は,

% pyenv versions
 * system (set by /Users/username/.pyenv/version)
   anaconda3-5.1.0

system (もともと入っている python2.7 )に加えて,anaconda が表示される。
* が付いている方が,今 python と打つと起動する方である。

pyenvの使い方

% pyenv versions
   system
 * anaconda3-5.1.0 (set by /Users/nyaaaaoooon/current/directory/.python-version)

と打つと,今いるディレクトリ内で起動する python が anaconda3-5.1.0 に変えられる。
上に書かれている通り,そのディレクトリ内に存在する .python-version というファイル(ls -a などで存在を確認できるし,cat などで中身も見られる。)によって設定されている。

コンピュータ全体の python を変えてしまいたいときは,

% pyenv global anaconda3-5.1.0

とすればオーケー。

ローカルな設定を消すためには,

% rm .python-version

Homebrew の警告を無くす

とか言って真似してインストールすると,下のように homebrew が軽い警告を発して邪魔だよと言ってくる。
一応対処したくなる。

% brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
  /Users/nyaaaaoooon/.pyenv/shims/icu-config
  /Users/nyaaaaoooon/.pyenv/shims/libpng16-config
  /Users/nyaaaaoooon/.pyenv/shims/python3.6m-config
  /Users/nyaaaaoooon/.pyenv/shims/python-config
  /Users/nyaaaaoooon/.pyenv/shims/python3-config
  /Users/nyaaaaoooon/.pyenv/shims/ncursesw6-config
  /Users/nyaaaaoooon/.pyenv/shims/pcre-config
  /Users/nyaaaaoooon/.pyenv/shims/python3.6-config
  /usr/local/root-6.12.06/cmake_build/bin/afterimage-config
  /usr/local/root-6.12.06/cmake_build/bin/pcre-config
  /usr/local/root-6.12.06/cmake_build/bin/root-config

ROOT の config ファイルも邪魔だと言われている。ので一緒に対処した。


これは,以下のリンクのやり方で回避できた。
www.task-notes.com


.zshrc に,

alias brew="env PATH=${PATH/\/Users\/username\/\.pyenv\/shims:\/usr\/local\/root-6\.12\.06\/cmake_build\/bin:/} brew"

を書き足した。
(2020.09.27追記:ROOTを消したので、

alias brew="env PATH=${PATH/\/Users\/username\/\.pyenv\/shims:/} brew"

でうまくいく。)

パスについては 〇〇env をまとめて解説してるこのページも参考になるかも。
casualdevelopers.com

エイリアスの設定

ついでなので py3 で python3 に繋がるエイリアスも設定した。

alias py3="python3"

PyROOT との兼ね合い

私は,Homebrew でインストールしてあった python3.6 の場所を指定して ROOT をビルドすることで PyROOT を使えるようにしている。*2
PyROOT を壊したくなかったので,anaconda で同じものをインストールできるにも関わらず,そのまま Homebrew で先にインストールしてあった python3.6 を残している。
pyenv で system の python を使うよう指定しておけば,今まで通り使えた。
AnacondaからROOTが使えないのは勿体無い気もするが、面倒を考えるとしょうがないか。

使えたというのは,
私のパソコン上で "IPython" は homebrew で入れた Python3.6 によって起動するようになっているが(詳細は忘れた)その IPython 上から ROOT を import 出来たので,問題なさそうということ。

% pyenv local system
% ipython
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.
Python Startup!

In [1]: import ROOT

がエラーを吐かずに成功した。

anaconda を指定していると,

import ROOT が出来ず,error の山が吐かれる。

% pyenv local anaconda3-5.1.0
% ipython
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 12:04:33) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
Python Startup!

In [1]: import ROOT

 *** Break *** segmentation violation
・・・(エラーの山)・・・
[] (no debug info)

*1:これだけ多く検索結果が見つかるということはもはやポピュラーなやり方なのだろうか。

*2:今のところ,私は実際のデータを扱っていないのでまだ ROOT 講習会以外で使ったことはない。先輩が,python 使って書く必要があるから勉強中とか言っていたのでそのうち使う必要もあるのかもしれない。