VSCode&Python&venvでデバッグ実行

# VSCode & Python & venv でデバッグ実行

題名の通りですが

- VSCode
- Python
- venv

を使う環境で、ローカルのpythonプログラムをデバッグ実行します。
また、デバッグ時に引数を動的・静的に渡せるようにします。

## 事前準備

- Pythonのインストール (venvがある3.3~)
- VSCodeのインストール
  どちらでも動くとは思いますが、筆者はWindows10環境です
- VSCodeのpython拡張機能のインストール
  PythonとPython Debuggerは必須です

インストール方法はいくらでも出てきますので、ここでは割愛させていただきます。
PythonはWindowsの場合Microsoft Storeからのインストール、
Linuxの場合はそれぞれのPackage Managerで入れるのが比較的簡単かつ安定です。

## venv (pythonの仮想環境)の作成

pythonの仮想環境を用意します。
プログラマーであれば自分のOA機器などの実環境に特定のプログラムに依存するライブラリをインストールするのは気が引けるでしょう。
そのために便利なのがvenvです。venvを使えばpipでインストールするパッケージを実環境と隔離することができます。
VSCodeのターミナルを開き(PowerShellのターミナルでもOKです)、以下のコマンドを実行します。
:point_left: VSCode上でもできるみたいですが、ここではコマンドで作成しています。

```powershell
python -V # 実環境のpython version
Python 3.12.4
python -m venv .venv # .venvという仮想環境を作成
.\.venv\Scripts\activate # 仮想環境のアクティベート
```

これでvenvを使った仮想環境になりました。
以降、pythonやpipのコマンドはこの仮想環境内のコマンド扱いになります。ただし、このターミナルのセッションのみ有効です。

ここで

```powershell
pip install requests # requestsパッケージをインストール
```

を実行すれば、仮想環境内にパッケージをインストールすることができます。
ここでは例として、HTTP Requestを発行するパッケージの `requests` を入れます。

仮想環境を抜けたいときは

```powershell
deactivate
```

コマンドを実行すると、仮想環境を抜けて元の環境に戻ります。

### :bulb: venvポイント

急いでいる方は読み飛ばしてかまいません。
venvのポイントとなるのは、作成した仮想環境のディレクトリ内を見ると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168286/6396bb86-1af6-2361-7f1c-d09da959a43f.png)

のような構成になっていることです。
そのままの通りですが、作成したディレクトリ内にpythonとpipのexeファイルとLibディレクトリが用意されています。
つまり、ここに仮想環境のインタプリタと依存ライブラリの格納先が確保されているみたいですね。

先ほどの `.\.venv\Scripts\activate` のコマンドを実行すると、pythonのコマンドが、`.\.venv\Scripts\python.exe` にすり替わる形となっているようですね。
(つまり、activateしなくても上記のpythonパスを指定して実行すれば仮想環境内のpythonが利用できる)

## VSCodeのインタプリタ設定

1. 作成するpythonのプログラムをエディタで開きます
1. `Ctrl + Shift + P` でVSCodeのコマンド検索に入り、`Python: Select Interpreter` と入力し、選択します
  (おそらく入力補完ですぐ出てくると思います)

   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168286/1647117c-c7da-e309-69d2-29a70bfa1d25.png)

1. インタプリタを、作成した.venv配下の `python.exe` を指定します
   :bulb: 今回は直接選択肢に出てきてますが、表示されない場合は`Inter interpreter path...` から直接指定してください

   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168286/07b1da2a-102b-0f86-07d6-01cde76c8b80.png)

   これによって、VSCode経由でpythonのファイルを実行するときに、指定した仮想環境内のインタプリタが使われるようになります。

## デバッグ実行

では、VSCodeを使ってデバッグ実行してみましょう。
今回は以下のような簡単なプログラムを用意しました。

1. プログラムの用意

    ```python
    import requests
    import sys
    
    def main():
        res = requests.get(sys.argv[1])
        print(res.status_code)
    
    if __name__ == '__main__':
        main()
    ```
    
    なんということもない、引数に指定したURLへアクセスしてそのHTTPステータスコードを出力するプログラムです。
    `test.py` など適当な名前をつけてファイルを作成し、エディタで開きましょう。

1. デバッグ構成(launch.json)の作成

   左側のアイコンから、「実行とデバッグ」を選択します。

   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168286/26880e1f-a58f-b854-2ca7-45b5bac4e298.png)

   その後、「`launch.json`ファイルを作成します」を選択し、「デバッグ構成を選択する」で `引数含むPythonファイル` を選択しましょう。
   `Python` ファイルを選択してしまっても、後から`launch.json`ファイルで変更可能です。

   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168286/ef1e81a3-115d-b57a-399c-b213dae25b8c.png)

1. `launch.json` ファイルの変更

   `launch.json` ファイルは、VSCodeでデバッグを行う際の設定を記述するファイルです。
   (以下、jsonなのにコメントがあるとqiita側の表示でエラーになりますが、VSCode上だとデフォルトでコメントが入ってます)

    ```json
    {
        // IntelliSense を使用して利用可能な属性を学べます。
        // 既存の属性の説明をホバーして表示します。
        // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "My Python Program", // 任意の名前
                "type": "debugpy",
                "request": "launch",
                "program": "${file}", // fileだと開いているファイルを実行します。常に一意の.pyファイルを指定することもできます。
                "console": "integratedTerminal",
                "args": "${command:pickArgs}" // 毎回引数を入力します。常に同じ引数にしたい場合、ここに固定値を指定すればOKです。
            }
        ]
    }
    ```

1. デバッグしてみる

   では、ようやくデバッグです。
   `test.py` を開き任意の行にブレイクポイントを設定します。
   その後左側のアイコンから「実行とデバッグ」を選択、先ほど作成した `launch.json` の `name` に指定した名前を選択してデバッグを開始します。
   引数を聞かれるため、引数を入力します。ここでは `https://www.google.com` を入力しました。

   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168286/14f3ab15-69f6-401d-3834-10ed8e873f9a.png)
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168286/1e9881ec-b6ca-6cf8-6933-d5f99db5ca31.png)

   デバッグ実行が始まり、ブレイクポイントで止まりました。
   ここからは変数の中身を見たりステップインしたり好きにデバッグできます。

## 余談

インタプリタの設定は `launch.json` には記述できないみたいですね。
あと `launch.json` はjsonなのにコメントできるんだなーと感心してました。