【自己学習】Pythonで開発するための環境構築

# 始めに
本記事は自己学習の結果を記事として残すためのものであり、自分と同じくこれから機械学習の勉強を始めようとしている方の、若干の手助けとなればと思い書いています。
Qiitaにはこの手の記事がたくさん存在しますが、「ここは分かってるだろうから説明は省くね」パターンが多く、自分には説明が足りない記事が多いため、バカ（自分）にも分かるように細かく書いているつもりです。
本当は実装部分まで書こうと思ったんですが、環境構築部分のボリュームが思いの外多かったため、分割することにしました。
※理解が足りてなく、間違いがある可能性があるので、ご指摘をいただけたら嬉しいです。

##内容
- Pythonの開発環境の構築

###単語
- Homebrew
- pyenv
- pyenv-virtualenv

###やったこと
機械学習の勉強を始めたとき、pythonの初心者でもあったので、環境を用意することに物凄く手間取りました。まずはPythonで開発するために必要な環境構築に関して記載しています。


***

###環境の準備
####1. Homebrew
#####1.1 Homebrewとは
Homebrewとは、MacOSのパッケージ管理ツールだそうです。もちろん、Homebrewを使用せずとも、インストーラーをダウンロードし、展開することで、パッケージのインストールは可能です。ただ、Homebrewを使用することで、ターミナルからコマンドを打つだけで、目的のパッケージのインストール/アンインストールが可能となり、手間が省けます。ここでは、Homebrewを使用して、後述するpyenvとpyenv-virtualenvをインストールします。

#####1.2 Homebrewをインストール
以下のコマンドをターミナル上で叩くだけです。

     /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

※上記コマンドは頻繁に更新されるそうなので、以下HPにアクセスして、最新のコマンドを取得することをお勧めします。
[HomebrewのHP](https://brew.sh/index_ja.html)

つらつらと大量のログが表示され、最後にユーザのパスワードを要求された場合は、パスワードを入力後、Enterを押します。

完了後、下記コマンドを入力し[Already up-to-date]と表示されれば、Homebrewのインストールは完了です。

     $ brew update



#####2.pyenvのインストール
######2.1. pyenvとは
pythonのバージョンを切り替えることが可能なツールで、ディレクトリ毎に設定を切り分けることが可能です。

#####2.2 pyenvのインストール
以下のコマンドをターミナル上で実行します。

    $ brew install pyenv

#####3 pyenv-virtualenv

######3.1 pyenv-virtualenvとは
pyenv-virtualenvとは、ディレクトリ毎に仮想環境を構築し、Pythonのバージョン、インストールしているパッケージの管理を行います。とはいえ、pyenvだけでもバージョンの管理は可能なので、どこが良いの？と言う疑問が浮上しました。調べたところ、pyenvではディレクトリ毎にPythonのバージョンを管理できるが、インストールしているモジュールは`site-package`という共通の管理ファイルを参照しているとのこと。そのため、別バージョンのモジュールを使いたい、みたいな場面には対応が難しいそうです。そこで、pyrenv-virtualenvを使用することで、この`site-package`をディレクトリ毎に管理が可能となり、別環境の影響から完全に独立することが出来る！みたいな感じです。
（もちろん、他にもメリットはあるっぽいのですが理解不足により割愛）

######3.2 pyenv-virtualenvのインストール
以下のコマンドをターミナル上で実行します。

    $ brew install pyenv-virtualenv

#####4 環境変数の設定
これだけではインストールしたpynev、pyenv-virtualenvの設定が有効化されず、デフォルトでMacに入っているPythonの設定を参照してしまいます。ルートディレクトリに存在する.bash_profileの中身を編集して、環境変数にパスを追加します。（平たく言うと、今後Pythonを使用するときは、新しく導入したpyenvとpyenv-virtualenvの方の設定を参照してねって感じ）
bash_profileは、ターミナル起動時に参照する設定ファイルのようなものです。設定ファイルには.bashrcとかもあり、詳細は理解できてないですが、取り敢えず.bash_profileを編集することで問題なく動くので良しとします。
ターミナル上で以下のコマンドを入力し、.bash_profileを編集します。
※.bash_profileは隠しファイルのため、`ls -a`で表示することができます。
   
    vim .bash_profile

開いた.bash_profileに以下のコードを追記します。
    
    export PYENV_ROOT="${HOME}/.pyenv"  　//${HOME}はデフォルトで設定されている変数
    if [ -d "${PYENV_ROOT}" ]; then      //パス（PYENV_ROOT）の存在確認
        export PATH=${PYENV_ROOT}/bin:$PATH　 //:$PATHで、既存のパスも設定
        eval "${pyenv init-)"　　　　　　　　　　//eval で変数部分を展開しています。
        eval "$(pyenv virtualenv-init -)"    //pyenvとpyenv-virtualenvの環境を初期化し、環境を有効化
                                         

上記のコードを入力後、ターミナルで以下のコマンドを入力することで、設定ファイルの更新をします。
(ターミナルを再起動するでも問題ありません。)

     source ~/.bash_profile


#####5. pythonのインストール
pyenvではデフォルトでsystemしか入っていません。試しに、`pyenv versions`コマンドを入力すると以下のような結果が返ってきます。

    pyenv versions
      *system

今回使用するPythonのバージョンは`3.7.3`なので、以下のコマンドでインストールします。

    pyenv install 3.7.3

#####6. 仮想環境の構築＆Pythonのバージョン変更
これで`3.7.3`のインストールが完了しましたが、まだ適応はされていません。もう一度、`pyenv versions`を入力すると以下の結果が返ってきます。

     $ pyenv versions
       *system
        3.7.3

上記から、デフォルトである`system`が選択されていることが分かります。作業用のディレクトリを作成し、作成したディレクトリ内で以下のコマンドを実行し、仮想環境を構築します。

     $ pyenv virtualenv 3.7.3 test　//3.7.3:Pythonのバージョン
                                   //test:環境名
     $ pyenv local test
     $ activate test
     (test)$ //左記のように作成した(作成した環境名)が表示されればOKです。
     (test)$ pyenv versions //Pythonのバージョンを確認
           system
           3.7.3
           *test

これで、このディレクトリではtest(3.7.3)が適応されます。

`pyenv global test`でも問題ありませんが、今回はディレクトリ毎で環境を切りたいので、`local`を使用しています。`global`を使用すると、全ての環境で指定したバージョンが適応されます。

ここまでで、Pythonで開発するための環境構築が完了しました。次回の記事では、実際に機械学習で使用する各種モジュールのインストールから、簡単な実装までを書く予定です。