VSCodeのPython拡張機能が更新されJupyter Notebookが扱いやすくなったので試してみた

VSCodeのPython拡張機能が[更新されたと発表](https://blogs.msdn.microsoft.com/pythonengineering/2018/11/08/python-in-visual-studio-code-october-2018-release/)され、Jupyter Notebookの扱いが便利になったようなので確認してみました。

## 要約
- VSCode上でPythonコード(拡張子`.py`)を`#%%`の区切り単位で実行できる
- 実行結果はコードと合わせてJupyter Notebook形式(拡張子`.ipynb`)で出力できる
- 逆に既に作成されたJupyter Notebook形式のファイルを`#%%`で区切られたPythonコードに変換することもできる
- つまりVSCodeのみでJupyter Notebookの新規作成や既存ファイルの編集を完結させられる

## 環境
OS : Windows10 (10.0.17134)
Visual Studio Code : 1.28.2
VSCodeのPython拡張機能 : 2018.10.1
python : 3.6.6
jupyter : 1.0.0
jupyter_contrib_nbextensions : 0.5.0
パッケージ管理にはconda(4.5.11)を使用し、pipでは検証していません。

## 仮想環境の作成
```
conda create -n test -y
```
※ `test`は適当に付けた仮想環境名であり、実際には自由に好きな名前を付けて下さい。

## Jupyter Notebookの扱いに必要なパッケージのインストール
```
conda install jupyter jupyter_contrib_nbextensions -y
```
※ `jupyter_contrib_nbextensions`がないと後のファイル変換の際にエラーが出ます。

## 今回の動作確認用に使用するパッケージのインストール
```
conda install numpy matplotlib -y
```

## 拡張子.pyのPythonファイルを新規作成
ここでは`test.py`とします。

## 作成した仮想環境をVSCodeで選択
下記記事などを参考にして下さい。

Visual Studio Code のデバッグで、virtualenv, venv のPython仮想環境を使う
https://qiita.com/82p/items/7c1b3b6c470b2f08bf51

## 実行してみる
実行単位となるセル毎に先頭に`#%%`を付けるとその上に`Run Cell`と表示されるので、クリックするか`Shift+Enter`を押して実行します。
すると右側に新しいウインドウ(Python Interactive)が開いて実行結果が表示されます。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/156265/b24b9057-5c22-0d96-3e82-bdd844239ca0.png)

## Jupyer Notebook形式(拡張子`.ipynb`)で出力
保存ボタンをクリックするとJupyter Notebook形式で出力できます。(ファイル名を`test.ipynb`とします。)

![a.png](https://qiita-image-store.s3.amazonaws.com/0/156265/01ed9624-73b2-acf7-615b-fee4071a9206.png)

## ブラウザで開いてみる
`.ipynb`形式で出力した直後に右下にこのような通知が表示され、「Open in browser」をクリックするとブラウザで開くことができます。

![export.png](https://qiita-image-store.s3.amazonaws.com/0/156265/1dc8b92f-bf73-25a5-7a69-3b785333f905.png)

通知を消してしまった場合は、コマンドラインで`jupyter notebook`を実行して先程保存した`.ipynb`形式のファイルをブラウザで開きます。
開いてみると以下のように出力も行われた状態で保存されていることが分かります。このまま配布しても問題ないですね。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/156265/94aa1b9c-a052-ba76-47f0-8d7631a58f1c.png)

## 今度は逆にブラウザ上で編集した`.ipynb`ファイルをVSCodeで開く
下図のように編集してみます。
ついでにMarkdown形式のコメントも追加しました。
ちなみにmatplotlibでグラフ表示している箇所で1番目のセルで定義された変数`x`を使用していますが、先程の手順で`jupyter notebook`コマンドを実行して開いた場合は一旦1番目のセルを実行しなければ変数が定義されないためエラーとなって表示されません。
一方、通知から開いた場合はVSCodeで起動済みのものにアクセスするため、変数も全て定義済みの状態で操作できます。

![9-1.png](https://qiita-image-store.s3.amazonaws.com/0/156265/2fcdfd0d-4e8c-b2b3-e088-ad0c8db54545.png)

上書き保存した`test.ipynb`をVSCodeで開こうとすると「Pythonコードにインポートしますか？」と右下に表示されるので`Import`をクリックします。
表示されない場合はファイルを右クリックし、「Import Jupyter Notebook」をクリックして下さい。

![9-2.png](https://qiita-image-store.s3.amazonaws.com/0/156265/630bcb20-02f4-6af4-1df8-4299aa160e5a.png)

すると下図の左側のように新たなファイルが生成されます。
`Run All Cells`をクリックすれば右側のようにきちんと表示されます。
またMarkdown形式のコメントは先頭に`#%% [markdown]`を付ければいいことが分かります。

![9-3.png](https://qiita-image-store.s3.amazonaws.com/0/156265/bdb2652d-f6a7-4903-bb10-e21226404b66.png)

ちなみにグラフの軸の数字が見えないのは黒系のテーマを使用しているからで、テーマをLight(Visual Studio)にすると以下のように表示されます。

![9-4.png](https://qiita-image-store.s3.amazonaws.com/0/156265/f3bc8eed-a336-343d-d6e1-28e8c342d917.png)

## おまけ
`tqdm`で進捗表示させようと思ったのですが更新毎に新たな行に表示されてしまいました。
`tqdm_notebook`の方は表示すら不可能でした。

![ext.png](https://qiita-image-store.s3.amazonaws.com/0/156265/f22a9464-6272-741e-fde8-aca8d5bfa482.png)

## まとめ
`.py`ファイルをVSCode上で実行して出力を確認
⇒`.ipynb`形式で保存
⇒ブラウザ上で確認・編集して上書き
⇒再度VSCode上で開く

という作業が行えることを確認できました。
これでVSCodeの強力な拡張機能を利用してJupyter Notebookの編集が行えますね。