VSCodeがネイティブ対応したjupyterをpython3.8で動かそう

2020/1/6 venvとvirtualenvを混同していたためvirtualenvについて修正
> venvとvirtualenvは別物でした...!

# 何の記事？

`VSCodeがjupyterにネイティブ対応`したそうで、`webブラウザ`が無くても
`ipynb`を操作できるようになっていました。

本記事は「じゃあ使ってみよう！」と思い`python3.8`で環境を作ったところ、
詰まった部分があったので、「こうやるとうまくいくよ」という共有の記事です。

<strong>anacondaではなくvirtualenv向けの環境を作ります。</strong>

# 環境を作る（コマンドプロンプトで操作）

## 環境

OS : Windows10
python : 3.8
editor : VSCode 1.40.2

VSCodeに`拡張機能のpython`を入れておいてください。
ついでに`IntelliCode`も入れておくとハッピーです。

## まずはvirtualenv

`virtualenv`が入っていない場合は`pip`しましょう。

```bash:virtualenvをインストール
>pip install virtualenv
```

そしたら、仮想環境を作成します。

```sh:\Users\usr1
>mkdir virtualenv
>cd virtualenv
>py -m virtualenv jupyter_env

~~~省略~~~
done.(これが表示されたら完了)
```

そしたら作った環境を起動します。

```text:起動
>jupyter_env\Script\activate
(jupyter_env)>
```

プロンプト`>`の前に`(jupyter_env)`が表示されていれば起動完了です。

## ここからはVSCodeで作業します

コマンドプロンプトから`VSCode`を起動しましょう。

```text:現在位置は\User\usr1\virtualenv\
(jupyter_env)>code .
```

VSCodeが起動したら、ターミナルを`Ctrl`+ `Shift` + `~`で表示させます。


## pipをアップグレードする

念のため。

```text:pipのアップグレード
(jupyter_env)>py -m pip install --upgrade pip
```

## jupyterをいれる

`pip`していきましょう。ほかに必要となるライブラリも一緒に入ってくれます。

```text
(jupyter_env)>pip install jupyter
```

いっぱいはいります。

# VSCodeでipynbを作成する

`Ctrl`+`Shift`+`p`を押してコマンドパレットを開きます。
開いたら、`jupyter`と入力すると、以下が出てきます。
![commmand_palet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301091/f8aa7d58-dc2c-c27b-56d9-658b52269e71.png)

`Python: Create New Blank Jupyter Notebook`を選択します。

![notebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301091/7e4445b5-00b4-d29f-6e9b-04fc475bf18d.png)

jupyterっぽい画面が表示されました。

続いて`pythonインタープリタ`を選択します。
`Ctrl`+`Shift`+`p`を押してコマンドパレットを開きます。
開いたら、`select`と入力すると、以下が出てきます。 
![notebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301091/17d6a5e0-6f17-0c9c-9c6b-a6ac376d4a20.png)
`Python: Select Interpreter`を選択します。
作った環境名が出てきますので、選択します。


# HelloWorld（できない）

早速動かしてみましょう。
１セル目に以下を入力して`Shift`+`Enter`で実行します。


```py:helloworld
print('Hello world!')
```

動きません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301091/84a6cabd-81cb-9542-8dc1-55d3640a4ff4.png)

# 動かない原因

どうやらjupyterが利用している`tornado`というライブラリに不具合があるそうです。
> 参考：[Jupyter Notebook with Python 3.8 - NotImplementedError](https://stackoverflow.com/questions/58422817/jupyter-notebook-with-python-3-8-notimplementederror)

# 対策

`tornado`の`asyncio.py`を編集することで対策できました。

```\venv\jupyter_env\Lib\site-packages\tornado\platform\asyncio.py
import asyncio    # この下に追記
import sys

if sys.platform == 'win32':
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

```

## もう一度実行してみましょう。

`Shift` + `Enter`で実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301091/e8d8d278-7713-c7d2-0f03-a79ac4d745dd.png)
やった！スタート地点に立つことができましたね！

立てなかった方は、ポートが使用済みの可能性があります。

jupyterはデフォルトで`8888`ポートを使用します。
コマンドプロンプトにて`netstat`を実行し、`8888`が使用されていないか確認してみてください。

それでもだめなら、環境構築に失敗しているかもしれません。
もう一度確認してみてください。  

（考慮漏れなど、お気づきの点がございましたらコメントにてご指摘をお願いします！）

それでは、よい**ジュピ活**を！

# 参考
本記事は、ほかの方々が書いている記事を参考にさせていただきました。

@simonritchie さんの記事
[VS CodeのPython拡張がJupyterをネイティブサポートしたそうなので早速使ってみた。](https://qiita.com/simonritchie/items/5d865e72dba47cf8f6c0)

@matuya さんの記事
[python3.8 venv環境でjupyter notebook](https://qiita.com/matuya/items/f32bda540fa88d9752a6)