macOSに構築したPython環境を維持管理する（pyenv＋Anaconda）


# macOSに構築したPython環境を維持管理する（pyenv＋Anaconda）

macOSに構築したPythonの開発環境を維持管理します。なお、この記事は、以下記事の続きです。

- [macOSにPython環境を構築する（pyenv＋Anaconda）](https://qiita.com/tanuk1647/items/3cf2f4a348220d90c612)

## 要件

- Homebrewでインストールしたソフトウェアについて、最新の状態を保つこと
- 作成したノートブック等が、バージョン管理されている状態を保つこと
- 必要に応じ、仮想環境やパッケージの追加、更新、削除を行うこと
- 他の構成に切り替える際に、Anaconda、pyenvをきれいに削除すること


## 構成

- macOS High Sierra
- Homebrew
- pyenv
- Anaconda
- TensorFlow / Keras


## 概要

以下について記載します。

- Homebrewの更新
- Gitを使ったバージョン管理の実施
- 仮想環境の追加
- パッケージの追加
- パッケージの更新
- パッケージの削除
- 仮想環境の削除
- Anacondaの削除
- pyenvの削除


## 注意事項

**注意事項**

- コマンド内に`<作成したワークスペース>`等の記載がある場合、各自の環境に合わせて読み替えて実行してください。冗長となるので、特に見落としそうな箇所を除けば、但し書きを書いていません。

```bash
pyenv versions
python -V
cd <作成したワークスペース>
pyenv versions
python -V
pyenv local anaconda<バージョン>
pyenv versions
python -V
```

- コマンドは、一行ずつ実行してください。
- 何かをインストール、設定したはずなのに、`-bash: hoge: command not found`と言って怒られるときは、コマンド`exec $SHELL -l`で、シェルを再起動させると大体うまくいきます。


**参考サイト**

- [シェルを再起動させる簡単な方法](https://qiita.com/yusabana/items/c4de582c6f85a42817d8)


## 項目1. Homebrewの更新

**目的**

- Homebrew、Homebrew-Cask自体を最新化する
- Homebrew、Homebrew-Caskでインストールしたソフトウェアを最新化する
- Homebrew、Homebrew-Caskのキャッシュを削除する

**やること**

- Homebrew
    - `brew`できる状態であることの確認
    - Homebrew自体の更新
    - formulaの更新
    - 古いcellarの更新
    - 古いcellarとダウンロードキャッシュの削除

- Homebrew-Cask
    - Homebrew-Cask自体の更新
    - 最新のCaskのプルダウン
    - 古いCaskの更新
    - 古いキャッシュの削除

**手順**

- ターミナルを起動し、以下コマンドを実行する。

```bash
brew doctor
brew update
brew upgrade
brew cleanup
brew cask upgrade
brew cask cleanup —outdated
```

**補足**

- `brew update`時に、Homebrew-Cask自体の更新、最新のCaskのプルダウンも行われます。
- `brew upgrade`、`brew cleanup`の代わりに、`brew upgrade --cleanup`を実行しても構いません。
- `brew cask install`でインストールしたソフトウェアの内、例えばGoogle Chromeのように、ソフトウェア自体にアップグレード機能が付いているものは、`brew cask upgrade`ではアップグレードされません。各ソフトウェアの機能を使ってアップグレードしてください。
- Homebrewの用語（brew, celler, formula...）については、参考サイトの五番目がわかりやすいです。（ちなみに、caskは樽を意味します。）

**参考サイト**

- [brew(1) – The missing package manager for macOS](https://docs.brew.sh/Manpage)
- [How to Use Homebrew-Cask](https://github.com/Homebrew/homebrew-cask/blob/master/USAGE.md)
- [homebrewの更新はbrew upgrade --cleanupだけでよくなっている](https://blog.n-z.jp/blog/2017-04-27-homebrew-upgrade-cleanup.html)
- [Homebrewでcask upgradeが実装されていた](https://rcmdnk.com/blog/2018/03/14/computer-mac-homebrew/)
- [homebrewとは何者か。仕組みについて調べてみた](https://qiita.com/omega999/items/6f65217b81ad3fffe7e6)


## 項目2. Gitを使ったバージョン管理の実施

**目的**

- 作成したノートブック等が、バージョン管理されている状態を保つ

**やること**

- GitHubのアカウントの作成
- Gitがインストールされていることの確認
- GitのGUIクライアントのインストール
- バージョン管理の実施

**手順**

- [GitHub](https://github.com/join)にて、アカウントを作成する。
- ターミナルより、コマンド`git --version`を実行し、gitがインストールされていることを確認する。
- [GitのGUIクライアント一覧](https://git-scm.com/download/gui/mac)を確認し、自分好みのクライアントを見つける。ここでは、GitHub公式、かつ、初心者向けの「GitHub Desktop」を選んだものとする。
- ターミナルを起動し、コマンド`brew cask install github`を実行する。
- [GitHubのWebメニュー（サインインが必要）](https://github.com/)、および、インストールされた「GitHub Desktop」を用いて、随時、バージョン管理（リモートリポジトリの作成、クローン、コミット、プッシュ）を実施する。

**補足**

- [環境構築](https://qiita.com/tanuk1647/items/3cf2f4a348220d90c612#%E6%89%8B%E9%A0%862-xcodecommand-line-tools%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)時、Command Line Toolsをインストールした際に、Gitがインストールされているはずです。
- 中上級者には、動作の早いらしい「GitUp」が良いかもしれません。コマンド`brew cask install gitup`でインストールできます。
- Gitの仕組みについては、参考サイトの二番目がすごくわかりやすいと思います。
- コミットメッセージに迷う（間違った）、あるいは、コミットの頻度に迷う場合は、参考サイトの三番目以降が参考になります。

**参考サイト**

- [\[macOS向け\] gitのクライアントはGitUpがいいぞ。](https://qiita.com/JotaroS/items/5042d2944cf0573f133e)
- [まずはGitの仕組みを理解することから](https://qiita.com/kyoyyy/items/161b6905f45bee2efe21)
- [Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)
- [Gitのコミットログは過去形ではなく現在形（＝命令形）で](https://minus9d.hatenablog.com/entry/2014/02/11/125222)
- [提言: コミットメッセージの一行目には要求仕様を書け](https://qiita.com/magicant/items/882b5142c4d5064933bc)
- [Git 作業における commit と push の頻度について](https://qiita.com/kozyty@github/items/87fa95a236b6142f7c10)
- [GitHubに投稿したcommit messageを修正するには](http://poyopoyo0.hatenablog.com/entry/2015/05/12/195041)
- [viコマンド集](http://www.ritsumei.ac.jp/~tomori/vi.html)
- [現在のブランチ名を取得するコマンド](https://qiita.com/usamik26/items/8aa6c3aed4b9c7dba5ca)


## 項目3. 仮想環境の追加

**目的**

- 仮想環境を追加する

**やること**

- 仮想環境の作成
- 仮想環境をJupyter Notebookのカーネルとして追加

**手順**

- ターミナルを起動し、ワークスペースに移動後、以下いずれかのコマンドを実行する。
    - 既存環境をクローンする場合は、`conda create -n <クローン先環境名> --clone <クローン元環境名>`
    - 新規に環境を作成する場合は、`conda create -n <仮想環境名> python anaconda`

- ターミナルを起動し、以下コマンドを実行する。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
jupyter kernelspec list
ipython kernel install --user --name=<仮想環境名> --display-name=<Jupyter Notebook上での表示名>
jupyter kernelspec list
conda deactivate
```

**補足**

- 既存環境をクローンする場合、クローン元環境と同じバージョンのパッケージがインストールされます。
- 新規に環境を作成する場合、`anaconda`というフルパッケージが不要なら、`python`のみとし、随時必要なパッケージを追加していく形でも構いません。
- コマンド`conda activate`、`conda deactivate`は、`conda`のバージョンが4.4以上、かつ、[構築手順5](https://qiita.com/tanuk1647/items/3cf2f4a348220d90c612#%E6%89%8B%E9%A0%865-anaconda%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)で機能拡張済みの場合に利用可能となります。`source activate`、`source deactivate`は、シェルごと落ちることがあるので、`conda`コマンドの利用を推奨します。

**参考サイト**

- [pyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類](https://qiita.com/y__sama/items/f732bb7bec2bff355b69)
- [Recommended change to enable conda in your shell](https://github.com/conda/conda/blob/a4c4feae404b2b378e106bd25f62cc8be15c768f/CHANGELOG.md#440-2017-12-20)


## 項目4. パッケージの追加

**目的**

- 仮想環境にパッケージを追加する

**やること**

- 追加したいパッケージを検索
- パッケージの追加を検証
- パッケージを追加

**手順**

- ターミナルを起動し、ワークスペースに移動後、仮想環境に入る。次に、コマンド`conda search <パッケージ名>`を実行し、追加可能なパッケージを検索する。パッケージが見つからない、あるいは、明らかにバージョンが古いようなら、次手順（リポジトリへのアクセス）に移る。最新パッケージが見つかった場合は、コマンド`conda install --dry-run <パッケージ名>`を実行する。変更予定内容が出力されるのでよく確認する。特にダウングレードされるパッケージがある場合は、内容をよく確認する。問題なさそうなら、コマンド`conda install <パッケージ名>`を実行する。最後に、仮想環境から抜けて、手順終了。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda search <パッケージ名>
conda install --dry-run <パッケージ名>
conda install <パッケージ名>
conda deactivate
```

- 前の手順で、パッケージが見つからない、あるいは、明らかにバージョンが古いようなら、`conda`の[リポジトリ](https://anaconda.org/anaconda/repo)にアクセスし、追加したいパッケージを検索する。通常、複数のチャンネル（owner）がヒットするので、暫定的に、ダウンロード数が多く、かつ、バージョンの新しいものを選択する。ターミナルを起動し、ワークスペースに移動後、コマンド`conda install --dry-run -c <チャンネル> <パッケージ名>`を実行する。変更予定内容が出力されるのでよく確認する。特にダウングレードされる関連パッケージがないか注意する。その場合は、他のチャンネルでも試してみる。最終的にチャンネルが決まったら、コマンド`conda install -c <チャンネル> <パッケージ名>`を実行する。最後に、仮想環境から抜けて、手順終了。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda install --dry-run -c <チャンネル> <パッケージ名>
conda install -c <チャンネル> <パッケージ名>
conda deactivate
```

**補足**

- 実環境（base）は、構築時の状態のまま残しておくのがベターかなと思います。何か問題が発生したとき、構築時の状態に戻すために、Anacondaの再インストールが必要だからです。何も問題が発生していないなら、特に気にする必要はありませんが…。
- 仮想環境でコマンド`conda`を使うためには、`conda`のバージョンが4.4以上、かつ、[構築手順5](https://qiita.com/tanuk1647/items/3cf2f4a348220d90c612#%E6%89%8B%E9%A0%865-anaconda%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)で機能拡張しておく必要があります。バージョン管理の一貫性のため、是非機能拡張しておきましょう。
- パッケージを追加するコマンドには、`pip`と`conda`があります。例えば、[TensorFlow公式サイト](https://www.tensorflow.org/install/install_mac#installing_with_anaconda)では、公式でなくコミュニティサポートとの但し書き付きで、`pip`でのインストールを指示していたりします。しかし、`pip`は使わない方がベターでしょう。結局、`pip`も`conda`も同じ場所（`~/.pyenv/versions/anaconda<バージョン>/lib/python<バージョン>/site-packages/`）にパッケージをインストールしますが、`conda`から見たとき、二重にパッケージがインストールされているように見えるなど、バージョン管理が混乱するためです。参考サイトの二番目のように、実害が出るケースもあるようです。したがって、一貫して`conda`を使うのが良いと考えられます。

**参考サイト**

- [Command reference](https://conda.io/docs/commands.html)
- [condaとpip：混ぜるな危険](http://onoz000.hatenablog.com/entry/2018/02/11/142347)


## 項目5. パッケージの更新

**目的**

- `conda`を最新バージョンに更新する
- 仮想環境の`python`を最新バージョンに更新する
- 仮想環境の`python`をダウングレード、あるいは、メジャーアップデートする
- 仮想環境のすべてのパッケージを、最新バージョンに更新する
- 仮想環境の特定パッケージを、最新バージョンに更新する
- 仮想環境の特定パッケージを、特定バージョンに更新する

**やること**

- パッケージの更新を検証
- パッケージを更新

**手順**

- `conda`を最新バージョンに更新するには、以下手順を実施する。まず、ターミナルを起動し、ワークスペースに移動する。次に、コマンド`conda update --dry-run -n base conda`を実行する。変更予定内容が出力されるのでよく確認する。問題なさそうなら、コマンド`conda update -n base conda`を実行する。

```bash
cd <ワークスペース>
conda update --dry-run -n base conda
conda update -n base conda
```
- 仮想環境の`python`を最新バージョンに更新するには、以下手順を実施する。まず、ターミナルを起動し、ワークスペースに移動後、仮想環境に入る。次に、コマンド`conda update --dry-run python`を実行する。変更予定内容が出力されるのでよく確認する。問題なさそうなら、コマンド`conda update python`を実行する。最後に、仮想環境から抜ける。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda update --dry-run python
conda update python
conda deactivate
```

- 仮想環境の`python`をダウングレード、あるいは、メジャーアップデートするには、以下手順を実施する。まず、ターミナルを起動し、ワークスペースに移動後、仮想環境に入る。次に、コマンド`conda install --dry-run python=<バージョン>`を実行する。変更予定内容が出力されるのでよく確認する。問題なさそうなら、コマンド`conda install python=<バージョン>`を実行する。最後に、仮想環境から抜ける。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda install --dry-run python=<バージョン>
conda install python=<バージョン>
conda deactivate
```

- 仮想環境のすべてのパッケージを最新バージョンに更新するには、以下手順を実施する。まず、ターミナルを起動し、ワークスペースに移動後、仮想環境に入る。次に、コマンド`conda update --dry-run --all`を実行する。変更予定内容が出力されるのでよく確認する。特にダウングレードされるパッケージがある場合は、内容をよく確認する。問題なさそうなら、コマンド`conda update --all`を実行する。最後に、仮想環境から抜ける。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda update --dry-run --all
conda update --all
conda deactivate
```

- 仮想環境の特定パッケージを最新バージョンに更新するには、以下手順を実施する。まず、ターミナルを起動し、ワークスペースに移動後、仮想環境に入る。次に、コマンド`conda update --dry-run <パッケージ名>`を実行する。変更予定内容が出力されるのでよく確認する。問題なさそうなら、コマンド`conda update <パッケージ名>`を実行する。最後に、仮想環境から抜ける。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda update --dry-run <パッケージ名>
conda update <パッケージ名>
conda deactivate
```

- 仮想環境の特定パッケージを特定バージョンに更新するには、以下手順を実施する。まず、ターミナルを起動し、ワークスペースに移動後、仮想環境に入る。次に、コマンド`conda search <パッケージ名>`で、更新可能なバージョンを確認する。続いて、コマンド`conda install --dry-run <パッケージ名>=<バージョン>`を実行する。変更予定内容が出力されるのでよく確認する。問題なさそうなら、`conda install <パッケージ名>=<バージョン>`を実行する。最後に、仮想環境から抜ける。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda search <パッケージ名>
conda install --dry-run <パッケージ名>=<バージョン>
conda install <パッケージ名>=<バージョン>
conda deactivate
```

**補足**

- 現在追加されているパッケージは、コマンド`conda list`で一覧表示できます。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda list
conda deactivate
```

- `conda update`の代わりに`conda updgrade`でも構いません。エイリアスの関係なので、自分にとって自然な方を利用すればOKです。

**参考サイト**

- [Command reference](https://conda.io/docs/commands.html)
- [Anacondaの本体とパッケージ一式のアップデート方法](https://minus9d.hatenablog.com/entry/2015/06/30/233522)


## 項目6. パッケージの削除

**目的**

- 仮想環境からパッケージを削除する

**やること**

- パッケージの削除を検証
- パッケージを削除

**手順**

- ターミナルを起動し、以下コマンドを実行する。変更予定内容が出力されるのでよく確認する。

```bash
cd <ワークスペース>
conda info -e
conda activate <仮想環境名>
conda uninstall --dry-run <パッケージ名>
```

- 問題なさそうなら、以下コマンドを実行する。

```bash
conda uninstall <パッケージ名>
conda deactivate
```

**補足**

- `conda uninstall`の代わりに`conda remove`でも構いません。エイリアスの関係なので、自分にとって自然な方を利用すればOKです。
- 変更予定についてですが、例えば、パッケージAがパッケージBに依存している場合、Bの削除時にAが削除されるのは、むしろパッケージ管理的に問題ないと考えられます。そのような観点で確認します。

**参考サイト**

- [Command reference](https://conda.io/docs/commands.html)


## 項目7. 仮想環境の削除

**目的**

- 仮想環境を削除する

**やること**

- 仮想環境をJupyter Notebookのカーネルから削除
- 仮想環境の削除

**手順**

- ターミナルを起動し、ワークスペースに移動する。コマンド`jupyter kernelspec list`を実行し、カーネルの存在するディレクトリを確認する。確認したディレクトリを手動で削除する。
- ワークスペース内で、コマンド`conda uninstall -n <仮想環境名> --all`を実行する。

```bash
cd <ワークスペース>
jupyter kernelspec list
conda info -e
conda uninstall -n <仮想環境名> --all
conda info -e
conda deactivate
```

**補足**

- `conda uninstall`の代わりに`conda remove`でも構いません。エイリアスの関係なので、自分にとって自然な方を利用すればOKです。

**参考サイト**

- [Jupyterで複数カーネルを簡単に選択するための設定](https://qiita.com/tomochiii/items/8b937f15c79a0c3eae0e#%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
- [Making kernels for Jupyter](http://jupyter-client.readthedocs.io/en/latest/kernels.html#kernelspecs)
- [Command reference](https://conda.io/docs/commands.html)


## 項目8. Anacondaの削除

**目的**

- Anacondaを削除する

**やること**

- 仮想環境をJupyter Notebookのカーネルから削除
- Anaconda削除ツールのインストール、実行
- Anacondaのディレクトリ一式の削除
- （必要に応じ）バックアップの削除
- Bash設定ファイルからAnaconda関連の記載を削除
- アプリケーションから、Anaconda-Navigator.app（リンク）を削除

**手順**

- 項目7を参考に、仮想環境をJupyter Notebookのカーネルから削除する。
- ターミナルを起動し、以下コマンドを実行する。なお、コマンド`anaconda-clean`実行時、`command not found`と言われたら、`exec $SHELL -l`で、シェルを再起動させるとうまくいく。

```bash
cd <ワークスペース>
conda install anaconda-clean
anaconda-clean
```

- Finderでホームに移動し、`[command] + [shift] + [.]`で、隠しファイルを表示する。`~/.pyenv/versions`直下から、ディレクトリ`anaconda<バージョン>一式`を削除する。
- ディレクトリ`~/.anaconda_backup`の中身を確認し、不要と思えれば削除する。他の構成に切り替え後、再利用できそうなら残しておく。迷う場合は、大した容量ではないので、残しておく。
- `~/.bashrc`から、[構築手順5](https://qiita.com/tanuk1647/items/3cf2f4a348220d90c612#%E6%89%8B%E9%A0%865-anaconda%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)で追加した記載を削除後、コマンド`source ~/.bashrc`を実行するか、コマンド`exec $SHELL -l`で、シェルを再起動させる。
- アプリケーションアイコンをクリックし、「Finderで開く」をクリックする。ウィンドウが開いたら、Anaconda-Navigator.app（リンク）を削除する。

**参考サイト**

- [Uninstalling Anaconda](https://docs.anaconda.com/anaconda/install/uninstall)


## 項目9. pyenvの削除

**目的**

- pyenvを削除する

**やること**

- ワークスペースに対する設定の削除
- pyenvの削除
- Bash設定ファイルからpyenv関連の記載を削除

**手順**

- Finderでワークスペースに移動し、ファイル`.python-version`を削除する。
- ターミナルを起動し、コマンド`brew uninstall pyenv`を実行する。
- Finderでホームに移動し、ディレクトリ`.pyenv`一式を削除する。
- `~/.bash_profile`、`~/.bashrc`から、[構築手順4](https://qiita.com/tanuk1647/items/3cf2f4a348220d90c612#%E6%89%8B%E9%A0%864-pyenv%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)で追加した記載を削除後、コマンド`source ~/.bash_profile`、`source ~/.bashrc`を実行するか、コマンド`exec $SHELL -l`で、シェルを再起動させる。

**参考サイト**

- [pyenv自体のアンインストール方法](https://qiita.com/kamol/items/6f659b51c96a71e2a978)