MacでAnaconda/Jupyter Notebook をつかえる環境を構築する(含 Homebrew,pyenv,Pythonのインストール)

[Python](https://www.python.org/)でデータ分析とかしてると、[Jupyter Notebook](https://jupyter.org/) っていうブラウザ上のコンソールでPythonを操作するサンプルなどがネットで出てきます。。それらを実行するJupyter Notebook環境をMacで構築するときの手順メモです。

[Jupyter Notebook](https://jupyter.org/) は、データ分析・科学計算などのプラットフォームである[Anaconda](https://www.anaconda.com/)に同梱されているモノをインストールしようと思います。


## 前準備

PythonはPython2系と3系があって、Macにはデフォルトで2系がインストールされています。で、その環境を壊すことなく別バージョンのPython(Python3やAnacondaのこと)を使用するには、pyenvというバージョン切替ツールをつかうことが多いです。そしてそして、そのpyenvは MacのパッケージマネージャであるHomebrew経由でインストールします。


### Homebrewのインストール

参考: https://brew.sh/index_ja

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew --version
Homebrew 1.8.2
Homebrew/homebrew-core (git revision 6f74; last commit 2018-11-11)
$
```

以上です。

### pyenvのインストール
早速Homebrewでpyenvを入れます。

```bash
$ brew install pyenv
==> Downloading https://homebrew.bintray.com/bottles/pyenv-1.2.8.mojave.bottle.t
######################################################################## 100.0%
==> Pouring pyenv-1.2.8.mojave.bottle.tar.gz
🍺  /usr/local/Cellar/pyenv/1.2.8: 612 files, 2.4MB
```


インストールはOK。.bash_profileに以下を追加します。

```bash
$ cat << '__EOF__' >> ~/.bash_profile
## Set path for pyenv
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
__EOF__
$
```

```bash
$ cat ~/.bash_profile
## Set path for pyenv
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
```

```bash
$ source ~/.bash_profile
$ pyenv --version
pyenv 1.2.8
$
```

以上で、pyenvのインストール完了です。

### pyenvでのPythonのセットアップ


```bash
$ python --version
Python 2.7.10
```

Macには、このPythonが標準で入っています。


```#bash
$ pyenv versions
* system (set by /Users/xxx/.pyenv/version)
```

pyenvでインストールできるPythonを一覧してみます。

```bash
$ pyenv install --list
Available versions:
  ...
  3.6.7
  3.7.0
  3.7-dev
  3.7.1
  3.8-dev
  ...
  anaconda3-5.2.0
  anaconda3-5.3.0
```

ためしに3.7.1を入れてみます。

```bash
$ pyenv install 3.7.1
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.1.tar.xz...
-> https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz
Installing Python-3.7.1...
python-build: use readline from homebrew

Installed Python-3.7.1 to /Users/xxx/.pyenv/versions/3.7.1
```

下記のコマンドで、標準で稼働するPythonを切り替えます。

```bash
$ pyenv global 3.7.1
$ pyenv versions
  system
* 3.7.1 (set by /Users/xxx/.pyenv/version)
$  python --version
Python 3.7.1
```

以上でPythonのバージョン切替を行うための環境のセットアップは完了です。


## Anacondaのインストール

いよいよAnacondaです。pyenv上にインストールします。

```bash
$ pyenv install anaconda3-5.3.0
Downloading Anaconda3-5.3.0-MacOSX-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda3-5.3.0-MacOSX-x86_64.sh
Installing Anaconda3-5.3.0-MacOSX-x86_64...
Installed Anaconda3-5.3.0-MacOSX-x86_64 to /Users/xxx/.pyenv/versions/anaconda3-5.3.0

$ pyenv versions
  system (set by /Users/xxx/.pyenv/version)
* 3.7.1
  anaconda3-5.3.0
$ pyenv global anaconda3-5.3.0
$ pyenv versions
  system
  3.7.1
* anaconda3-5.3.0 (set by /Users/xxx/.pyenv/version)
$

$ python --version
Python 3.7.0
```

Anacondaを使用できる環境の構築が完了です。

## Anacondaの分離環境を構築する

通常のPythonにはプロジェクトごとに仮想環境(分離環境)を構築するための venv コマンドというのが用意されていますが、Anacondaにも同じような環境分離ツール conda がありますので、それを使って分離環境を構築します。

例として、以下のコマンドで tmpという名前をつけた Python 3.7.2のの分離環境を構築します。

```bash
$ conda create --name tmp python=3.7.2   <- バージョン指定も出来る
.....
    zeromq:                             4.3.1-h0a44026_3
    zict:                               0.1.4-py37_0
    zipp:                               0.3.3-py37_1
    zlib:                               1.2.11-h1de35cc_3
    zstd:                               1.3.7-h5bba6e5_0

Proceed ([y]/n)?

...
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use:
# > source activate tmp
#
# To deactivate an active environment, use:
# > source deactivate
$
```

分離環境が構築できました。分離環境の中に入るには下記のコマンドで。

```bash
$ source activate tmp
pyenv: activate: command not found
```

怒られましたorz。。パスが通ってないからっぽいので、、、

```bash
$ ls -lrt $PYENV_ROOT/versions/
drwxr-xr-x  24 xxx  staff  816  4  7 19:17 anaconda3-5.3.0

$ source $PYENV_ROOT/versions/anaconda3-5.3.0/bin/activate  tmp
(tmp) $
(tmp) $ python --version
Python 3.7.2
(tmp) $ 
```
分離環境に入れました。。


### その他コマンド

分離環境の一覧表示

```bash
$ conda info -e
# conda environments:
#
base                  *  /Users/xxx/.pyenv/versions/anaconda3-5.3.0
tmp                      /Users/xxx/.pyenv/versions/anaconda3-5.3.0/envs/tmp

$
```

ちなみに分離環境はpyenvからは下記のように見えるようです

```bash
$ pyenv versions
  system
  3.7.1
* anaconda3-5.3.0 (set by /Users/xxx/.pyenv/version)
  anaconda3-5.3.0/envs/tmp
```

中に入ってみてみると、、、

```bash
$ source /Users/xxx/.pyenv/versions/anaconda3-5.3.0/bin/activate  tmp
(tmp) $ pyenv versions
  system
  3.7.3
* anaconda3-5.3.0 (set by /Users/xxx/.pyenv/version)
  anaconda3-5.3.0/envs/tmp

(tmp) $ conda info -e
# conda environments:
#
base                     /Users/xxx/.pyenv/versions/anaconda3-5.3.0
tmp                   *  /Users/xxx/.pyenv/versions/anaconda3-5.3.0/envs/tmp

(tmp) $
```


分離環境から抜けるには

```bash
(tmp) $ source $PYENV_ROOT/versions/anaconda3-5.3.0/bin/deactivate
$ 
```


分離環境の削除コマンドはこちら。

```bash
$ conda remove -n tmp --all
Remove all packages in environment /Users/xxx/.pyenv/versions/anaconda3-5.3.0/envs/tmp:
...
Proceed ([y]/n)?
$

$ pyenv versions
  system
  3.7.1
* anaconda3-5.3.0 (set by /Users/xxx/.pyenv/version)
$
```

削除されました。



## Jupyter Notebook を起動

最後にJupyter Notebookを起動します。

```bash
$ jupyter notebook
[I 18:37:54.077 NotebookApp] JupyterLab extension loaded from /Users/xxx/.pyenv/versions/anaconda3-5.3.0/envs/tmp/lib/python3.7/site-packages/jupyterlab
[I 18:37:54.077 NotebookApp] JupyterLab application directory is /Users/xxx/.pyenv/versions/anaconda3-5.3.0/envs/tmp/share/jupyter/lab
[I 18:37:54.079 NotebookApp] Serving notebooks from local directory: /Users/xxx
[I 18:37:54.079 NotebookApp] The Jupyter Notebook is running at:
[I 18:37:54.079 NotebookApp] http://localhost:8888/?token=xxxxxxx
[I 18:37:54.079 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 18:37:54.086 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///Users/xxx/Library/Jupyter/runtime/nbserver-44243-open.html
    Or copy and paste one of these URLs:
        http://localhost:8888/?token=xxxxxxx

```

起動したようです。Webブラウザで上記URLにアクセスすればよさそうですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/00d38986-b465-b314-be11-4ea683e31a37.png)


停止は Ctrl C で停止可能です。



## まとめ

Anaconda/JupyterNotebookを使用するために、brew > pyenv > anaconda > condaの分離環境 > Jupyter っていうそこそこややこしい構図になってしまいましたが、分離した環境を作れることで、壊れたら消してまた構築するなど、便利な環境が構築できましたね。

おつかれさまでした。


##関連リンク

- [Python](https://www.python.org/) 公式
- [Homebrew](https://brew.sh/index) 公式
- [Simple Python Version Management: pyenv](https://github.com/pyenv/pyenv) 公式
- [Anaconda](https://www.anaconda.com/) 公式
- [The Jupyter](https://jupyter.org/) 公式
- [pyenvが必要かどうかフローチャート](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)
- [Pythonの環境構築と使い方（MacOS）](https://github.com/ghmagazine/python_stat_sample/blob/master/tutorial/env_const/macos.md)
- [bashのヒアドキュメントを活用する](https://qiita.com/take4s5i/items/e207cee4fb04385a9952#%E5%A4%89%E6%95%B0%E5%B1%95%E9%96%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E7%BD%AE%E6%8F%9B) .bash_profile に流し込んだら、変数が展開されて。。 ``'__EOF__'`` を囲むのね、、、。
- [仮想環境作成モジュールvenvで作成した仮想環境をつかって、PyCharmで開発を行う](https://qiita.com/masatomix/items/72ec11dc01eeb5282efc)