Python仮想環境をVisual Studio Codeにセットアップする手順

# はじめに
Pythonで機械学習のコードを書こうとして一番最初に躓いたのが開発環境の構築でした。というのもPythonを利用する場合、仮想環境を構築して複数バージョンのPythonや関連ライブラリのセットを切り替えて使えるようにしますが、これをVS Codeとうまく絡めた設定手順がわからなくて悩みました。

ということで、色々試行錯誤しながらVS CodeでPythonの仮装環境を利用する方法について手順をまとめました。

# Pythonのインストールと環境設定
Pythonのインストールと基本的な仮想環境設定は [@ms-rockさん](https://qiita.com/ms-rock) が書かれた [Python3インストール（Mac編）](https://qiita.com/ms-rock/items/72b8f1abc661c539bb09) という記事に詳しいのでこちらをご参照ください。本当はこの部分も自分で書いていたのですが、すでに秀逸な記事にしてくださっていたので参照させていただくことにします。

上記記事の「2.4. Homebrew + pyenv-virtualenvでのインストール方法」に従ってセットアップし、``$ pyenv virtualenv 3.6.7 coreml_ready``のコマンドでcoreml_readyという名称の仮想環境を作成します。インストールするpythonのバージョンは3.6.7です。

なお、補足事項として、Pythonのインストールで``configure: error: C compiler cannot create executables``のようなエラーが出た場合、xcode toolsがインストールされていないので、以下の手順でxcode toolsをインストールしてください。

1. ターミナルから``xcode-select --install``と入力
1. 以下のような確認画面が表示されるので［インストール］ボタンをクリック
<img width="495" alt="xcode-select_install_alert.png" src="https://qiita-image-store.s3.amazonaws.com/0/245269/cf8ce658-4e3d-d560-3e50-9267c845fc5b.png">
1. 以下のようなライセンス確認画面が表示されるので［同意する］ボタンをクリック
<img width="649" alt="xcode-select_install_agreement.png" src="https://qiita-image-store.s3.amazonaws.com/0/245269/d6790b02-b82c-af41-dcf6-c792251d93e0.png">
1. ダウンロードが始まるのでインストール完了までしばらく待つ
1. 以下のような画面が表示されるので［完了］ボタンをクリック
<img width="504" alt="xcode-select_install_completed.png" src="https://qiita-image-store.s3.amazonaws.com/0/245269/85b736b5-714e-62b7-99b4-091166e854a8.png">

さらに、Mojaveでは、``zipimport.ZipImportError: can't decompress data; zlib not available``のようにzlibが利用できないとのメッセージでPythonのコンパイルに失敗する場合があります。この場合には、[@zreactorさん](https://qiita.com/zreactor)が書かれた [［MacOS Mojave］pyenvでpythonのインストールがzlibエラーで失敗した時の対応](https://qiita.com/zreactor/items/c3fd04417e0d61af0afe) にあるように、``sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /``を実行してください。

## pyenv関連で覚えておきたいコマンド
以下のコマンドは、pyenv環境でいつも利用するコマンドですから覚えておいて損はありません。

```bash
$ pyenv versions #pyenvで利用可能なバージョン一覧を表示します
$ pyenv install -l #pyenvでインストール可能なpythonのバージョンを表示します。
$ pyenv install %バージョン番号% #pythonのバージョンを指定してインストールします。
$ pyenv global %バージョン番号% #該当バージョンをデフォルトの利用バージョンにします。
$ pyenv local %バージョン番号% #該当バージョンをそのディレクトリ下での利用バージョンにします。
$ pyenv virtualenv %バージョン番号% %環境名称% #指定のバージョン、名称で仮想環境を構築します。
```

# Visual Studio Codeの設定
VS Codeは予めインストールされているものとします。もしまだインストールされていない場合は、 [この辺りを参考](https://www.karelie.net/install-vscode-mac/) にインストールします。

## Pythonワークスペースの設定
機械学習においては、Pythonと関連ライブラリのバージョンの組み合わせが大事になります。そこで、同じバージョンの組み合わせのプロジェクトを一つのワークスペースにまとめ、そのワークスペースで利用されるPythonや関連ライブラリのバージョンを統一することで、バージョンミスマッチによる無駄な手戻りをなくすようにしたいと思います。

以下の例では、iOSのCoreML用にモデルを変換する[coremltools（KerasとTensorflowのバージョンの組み合わせに制限がある）](https://github.com/apple/coremltools)を利用するワークスペースを作成します。今後はスマホなどのエッジ側で推論を行うのが主流になると思われますので、KerasとTensorflowで転移学習したモデルをAndroid／iOS両者に対して提供、メンテしていく開発環境を構築します。

## ワークスペースの作成

1. Visual Studio Codeを起動する
1. ［ファイル］ー［ワークスペースを閉じる］を選択し、現在利用中のワークスペースを閉じる
1. ［ファイル］ー［名前をつけてワークスペースを保存］を選択
1. ［新規フォルダ］ボタンをクリックしてワークスペース用のフォルダを作成しフォルダに入る（例：coremltool_ready）
1. ［名前］欄にワークスペースファイルの名前を入力（例：coremltool_ready.code-workspace）
1. ワークスペース用フォルダ内にいることを確認して［保存］ボタンをクリック
1. ［ファイル］ー［ワークスペースを開く］を選択し、作成したばかりのワークスペースファイルを指定し［開く］ボタンをクリック

この時点ではまだワークスペースとして認識されていませんがプロジェクトフォルダを追加するとワークスペースとして認識され、エクスプローラーペインに「COREMLTOOL_READY（ワークスペース）」というワークスペースが表示されるようになりますのでご安心ください。以降はこのワークスペース内で作業を進めていきます。

## プロジェクトフォルダの作成

ワークスペース内に今回作成するプロジェクトのフォルダを作成します。

1. ［ファイル］ー［ワークスペースにフォルダを追加］を選択
1. 念のためカレントがワークスペースフォルダか確認します
1. ［新規フォルダ］ボタンをクリックしてフォルダを作成（例：setup_vscode）
1. 該当フォルダを選択して［追加］ボタンをクリック
1. ワークスペース内に追加したフォルダが表示される

## Pythonファイルの作成

該当プロジェクトにPythonファイルを新規に追加すると、以下の手順にあるようにPython環境の初期セットアップを簡単に行うことができます。

1. 作成したプロジェクトフォルダを右クリックし［新しいファイル］を作成する（例：versions.py）
1. 上記versions.pyファイルを開く
1. 以下のようにPython機能拡張のインストールを推奨されるので［インストール］ボタンをクリック
<img width="553" alt="python_extension_install_prompt.png" src="https://qiita-image-store.s3.amazonaws.com/0/245269/317868d9-f0fa-7614-f751-24a59e1e2872.png">
1. Python機能拡張から別のPythonを選択するよう要求されるので［Select Python Interpreter］をクリック
<img width="553" alt="select_python_alert.png" src="https://qiita-image-store.s3.amazonaws.com/0/245269/1c8d8483-6d1d-087c-ef31-6a771a0d2ba3.png">
1. コマンドパレットに表示されたインストール済みPythonのリストから使用するバージョンを選択
<img width="997" alt="select_python_list.png" src="https://qiita-image-store.s3.amazonaws.com/0/245269/2ac0a8e8-7e3a-ced5-96ac-1d75262749a0.png">
1. pylintがインストールされていないというダイアログが表示されるので［Install］ボタンをクリック
<img width="565" alt="pylint_install_prompt.png" src="https://qiita-image-store.s3.amazonaws.com/0/245269/73ecd673-48fb-afb6-4299-63266f9a6f04.png">

## この仮想環境下にインストールしておくべきライブラリ

本記事で対象とするバージョンは以下に限定しています。
<I>2019年2月22日　Jupyterを追記しました。</i>

- Visual Studio Code: 1.30.1
- Python: 3.6.7
- coremltools: 2.0
- Keras: 2.1.6
- Tensorflow: 1.5.0
- OpenCV: 3.4.4.19
- Plot: 3.0.2
- PIL: 5.4.0
- Jupyter: 指定なし

以下のコマンドで、バージョンを指定して各自が必要とするライブラリをインストールします。MobileNetなど代表的な画像認識モデルの学習で、coremltoolsを使用してiOS用のモデルも作成したければ下記のようになるでしょう。（2019年1月20日現在）

```bash
$ pip install coremltools==2.0
$ pip install keras==2.1.6
$ pip install tensorflow==1.5.0
$ pip install numpy==1.15.4
$ pip install opencv-python==3.4.4.19
$ pip install matplotlib==3.0.2
$ pip install pillow==5.4.0
$ pip install Jupyter
```

## 最終的なVS Codeはこんな感じ

最終的にVS Codeの画面はこんな感じになります。画面の一番下左に現在利用しているPythonのバージョンと仮想環境名が表示され、ここをクリックするとコマンドパレットが開いて利用可能な仮想環境の一覧が表示されます。また、ターミナルは、現在利用している仮想環境課でのターミナルとなり、手打ちで``source bin/activate``などを入力する必要も無くなります。
<img width="1280" alt="vscode_final.png" src="https://qiita-image-store.s3.amazonaws.com/0/245269/1a687d14-5a9e-a7cf-aaae-a28a14474e85.png">

## 付記：matplotlibが実行時エラーを吐く

matplotlibを使用してグラフをプロットするコードを実行すると、以下のようなエラーを吐き出すことがあります。というか、Mojaveでは必ず吐かれると思います。

```
Traceback (most recent call last):
  File "main_mobilenet.py", line 3, in <module>
    〜〜〜　中略　〜〜〜
  "/Users/%USERNAME%/.pyenv/versions/3.6.4/envs/for_coremltool/lib/python3.6/site-packages/matplotlib/backends/backend_macosx.py", line 14,in <module>
  from matplotlib.backends import _macosx
ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installedas a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
```

これは、バックエンドの設定がMojaveでは動作しない設定になっているため発生するものなので、matplotlibの設定ファイルを修正すれば対処できます。対処方法については、 [@Gen6](https://qiita.com/Gen6) さんの [Pythonでmatplotlibをimportするとエラーが出る場合の対処策（Mac）](https://qiita.com/Gen6/items/78d83d117ef67e0d53c2) という記事に詳しいので参照してください。端的に行ってしまうと``matplotlibrc`` という設定ファイルの``backend``という設定項目を``macosx``から``TkAgg``に変更するだけです。