VSCodeでJupyter Notebookを使う

最近説明する機会が多いので書いておきます。

Jupiter Notebook自体はシステムにインストールしたPythonで動かせますが、Global環境を汚したくないので仮想環境（pipenv）で実行します。
pipenvは仮想環境を管理するためのパッケージです。
[Pipenv: Python Dev Workflow for Humans — pipenv 2023.7.12.dev0 documentation](https://pipenv.pypa.io/en/latest/)


## この記事でやること
- 仮想環境（pipenv）のインストール
- 仮想環境（pipenv）の作成
- Jupyterカーネルのインストール
- Jupyter Notebookファイルの実行


## 前提
- Python3のインストール
    - インストール時にPATHの設定をチェックしておく
- VSCodeのインストール
  - 以下の拡張機能をインストールしておく
    - Python(https://marketplace.visualstudio.com/items?itemName=ms-python.python)
    - Jupyter(https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter)

## Pythonの確認

Pythonが正常にインストールされ、PATHが通っているか確認します。
バージョンが表示されたら準備OKです。

```bash
> python -V
# Python 3.11.4

> pip -V
# pip 23.1.2 from C:\Users\WDAGUtilityAccount\AppData\Local\Programs\Python\Python311\Lib\site-packages\pip (python 3.11)
```

## pipenvのインストール

以下のコマンドを実行し、pipenvをインストールします。

```bash
> pip install pipenv
```

インストールが完了したら`pipenv`コマンドが使えるようになっていることを確認します。
コマンド一覧が表示されたらインストール完了です。

```bash
> pipenv
```

## 仮想環境の保存先の変更

デフォルトでは`~/.virtualenvs/プロジェクトごとのディレクトリ`に仮想環境の実体が作成されます。
しかし、不要になったときに消すのが面倒なので、プロジェクトディレクトリ内に作成する設定をします。

以下のコマンドを実行して環境変数を追加してください。

```bash
# Windowsの場合
setx PIPENV_VENV_IN_PROJECT 1

# Mac/Linuxの場合は以下を.bashrcや.zshrcに追加
export PIPENV_VENV_IN_PROJECT=1
```

## 仮想環境の作成

適当なディレクトリを作成してその中で仮想環境を作成します。
helpには`pipenv --python 3.7`のように指定するとありますが、`pipenv install`でもバージョン指定なしで作成できます。（面倒なのでこれでいきます）

```bash
# ディレクトリを作成してその中に移動
> mkdir python_test
> cd python_test

# 仮想環境の作成
> pipenv install
```

フォルダ1つとファイルが2つ作成されます。
仮想環境の保存先の変更を行っていない場合は`.venv`は作成されません。

```bash
> ls

    Directory: C:\Users\WDAGUtilityAccount\Desktop\python_test


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         7/19/2023  10:59 PM                .venv
-a----         7/19/2023  10:35 PM            155 Pipfile
-a----         7/19/2023  10:35 PM          21674 Pipfile.lock
```

## VSCodeで仮想環境ディレクトリをワークスペースとして開く

仮想環境を作成したディレクトリをワークスペースとしてVSCodeを起動します。


VSCodeのPathが通っていれば、ターミナルで対象ディレクトリに移動した状態で以下のコマンドを実行すると、ワークスペースとしてVSCodeが起動します。
起動しなかったら手動でVSCode起動、`ファイル`→`フォルダーを開く`で開いてください。

```bash
> code .
```

ここで開いたとき`信頼しますか？`のようなダイアログが出た場合は信頼してください。

## Python環境とカーネルの選択

環境の選択にはNotebookファイルを開く必要があるので、`任意の名前.ipynb`のファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/0238a069-1e8f-27fd-f957-63ed36493897.png)

Notebookファイルを開くと以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/99c6f07b-c4e4-72e6-9bab-9244f97ed536.png)

右上のボタンを押して、カーネルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/ff6e2707-956b-bb81-6fba-a8b68144a013.png)

ボタンを押すと表示されるポップアップにで`Python環境`→`Pipenv環境`を選択します。
（おすすめはシステムになっているので注意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/0f57eb52-ee25-2047-9067-79a15bc5748b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/91095df0-eeda-fbf8-5355-6f8b46c3c93a.png)

選択した環境が有効になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/ade798fb-c87b-91c9-ba24-7a400f405db2.png)

## カーネルのインストール

とりあえず空の状態でコードブロック左の実行ボタンを押してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/0fba2ae2-282b-9efa-6be8-9633c95cac7a.png)

カーネルパッケージのインストールを促されるので、`インストール`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/06ce3953-95f6-3db3-3627-fc653707ebc5.png)

右下に進捗が表示されるので、消えたらインストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/7247f5ee-ddf9-360a-5b8b-a64a22732466.png)

## コードを実行してみる

適当にコードを書いて実行してみます。

```python
for i in range(5):
    print("hello!")
```

動いたらセットアップ完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281125/55e5db0f-c859-9071-af7b-40b5963256cd.png)

## おまけ：パッケージのインストール

仮想環境はシステムと環境が分かれているため、pipを使ってインストールされたパッケージは使えません。
仮想環境内でパッケージ使うには、`pipenv install`コマンドを使ってインストールします。
```bash
> pipenv install パッケージ名

# ex) pipenv install requests
```

インストールが完了するとimportできるようになります。