Pythonでprintデバッグから卒業する【VSCode・CursorでPythonのデバッグ】

# はじめに
CやC++においてVSCodeの拡張でデバックを行ったことがあるのですが、Pythonでも簡単に導入できたので記事にしました。

:::note warn
注意
VSCodeと書いていますが、実際にはCursorを使用しています。どちらでもほぼ同じ形で使用できると思います。
:::

VSCodeのデバックを導入することで出来るようになること
1. 全ての変数の値がわかる
1. ブレークポイントを設定して、プログラムを途中で止めながら順番に確認する事ができる
1. print文を書かなくて良くなる


# 導入

VSCodeの拡張機能をインストールします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/59b6d8e3-ce27-5050-653a-1834c9004f9d.png)

画面左側の「launch.jsonファイルを作成します」をクリックすると、今開いているプロジェクトのルートに`.vscode`ディレクトリと`launch.json`が作成される。

`launch.json`に実行するpythonのパスを追加することが出来る。
```
"python": "path/to/python",
```

![スクリーンショット 2024-05-29 20.09.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/b8020ca1-e23e-6c9d-c495-ceda538417e1.png)




# デバックの実行
画面左側のメニューに「実行とデバック」という項目があるので選択する。実行とデバックをクリックするだけで実行は出来る。

![スクリーンショット 2024-05-29 19.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/88ec0f1e-1e47-151c-ee11-ba25aaf07b05.png)

またはPythonファイルを開いた状態だと、画面右上に「▶」の実行ボタンが表示される。
「▽」をクリックし「Pythonファイルのデバック」をクリックすることでも実行可能
![スクリーンショット 2024-05-29 20.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/cda90c17-4132-a2b2-6acf-7e09b07e53d8.png)

または画面左側にこのように表示されている場合は「▶」を押すだけで実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/8131cae3-d43c-d781-dc83-f19bbf50fd74.png)


### ブレークポイント
下図のようにプログラムの行数が表示されている部分の左側をクリックすると「赤い◯」が表示されます。
これが**ブレークポイント**です。この部分まで来たら処理を止めたり、次のブレークポイントまで一気に処理を進めたりすることが出来ます。

> ブレークポイントがあるところで処理を止めて、その時の変数の値を確認するのが基本的な使い方です

![スクリーンショット 2024-05-29 20.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/2e89e91e-0c00-c688-bbda-50c44e51b7c7.png)

ブレークポイントを設定して実行すると以下のような表示になります。これはブレークポイントでプログラムが止まっていることを示しています。

![スクリーンショット 2024-05-29 20.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/adb78f9c-10de-1535-f025-7e315e69b3c3.png)


# デバックの操作
デバックを実行すると画面上部にバーが表示されます。またカーソルを当てると機能が分かります。

![スクリーンショット 2024-05-29 20.04.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/ea22ad82-07eb-ff1d-eea0-e6134af4a0ae.png)

左から
1. **6点マーク**
ここをクリックしてドラッグするとバーの位置を動かせる
1. **▶:続行**
次のブレークポイントまでプログラムを実行
1. **↷：ステップオーバー**
1行だけプログラムを実行（関数の場合、関数の中に入らない）
1. **↓：ステップイン**
1行だけプログラムを実行(関数の場合、関数の中に入る)
1. **↑：ステップアウト**
関数の中から抜け出す。
1. **↺：再起動**
プログラムを再実行する
1. **□：停止**
プログラムの実行を停止する



# 画面の見方
画面左側のメニューで「実行とデバック」を選択すると下記のような表示がされています。

### 変数
現在定義されている変数の値が確認できます。
![スクリーンショット 2024-05-29 20.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/6d6eb8c3-7a18-6d36-602b-ce1f0bacbd5f.png)

###  ウォッチ式
式を自身で定義する。プログラムを順番に実行していく間に変数の値が変わることもあります。その変数が変わったのを監視して、その変数を用いた式を再評価します。

![スクリーンショット 2024-05-29 20.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/fcef9ee4-e396-db72-d9a3-0c11c842b0a6.png)

###  コールスタック
関数がネスト、入れ子になっていくとメモリ上に順番が記憶されていきます。（ざっくりした説明です。詳しくはC言語やメモリに関して調べてください）
関数がどの順番で実行されているかが分かります。

![スクリーンショット 2024-05-29 20.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/a26d2e6d-dd75-3b5a-6e9f-ef1620f9540e.png)



### デバックコンソール
ターミナルを開くと、デバックコンソールという欄があります。
このターミナルに変数を入力するとその変数の値が返ってきます。配列やnumpy、index指定、等式や不等式も入力できます。

> 私は左側の変数一覧よりも、デバックコンソールで値を確認することが多いです

![スクリーンショット 2024-05-29 20.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/698c7f4e-c5d0-6f1d-e876-d511eff16f02.png)


# 注意点

### 使用するpythonの指定

プロジェクトのルートに`.vscode/launch.json`を作成し、使用するpythonのパスを指定します。

anacondaなどの仮想環境を用いている場合は`which python`とターミナルに入力して、現在使用している環境のpythonのパスを指定しましょう。

```
"python": "path/to/python",
```

![スクリーンショット 2024-05-29 20.09.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085757/b8020ca1-e23e-6c9d-c495-ceda538417e1.png)


### 絶対パスで実行される
実行ボタンを押すと絶対パスで実行されるため、相対パスでのimportや、ファイル読み込みなどのパスには注意が必要です。

`sys.path.append('..')`のような記述がある場合は絶対パスに変更したり、適宜PYTHONPATHを追加するなどの対応を取ってください。

ここではパスに関する説明は省略します。また、実行するディレクトリの指定も可能かもしれませんが調査していません。


# 最後に
私もデバック機能の全てを使いこなせているわけではないのですが、処理を止めながら途中の変数の値を見られるようになるだけでも大分変わります！

私もついprint()デバックをしてしまうこともありますが、ぜひデバック機能も活用してみてください。

最後まで読んでいただきありがとうございました。