2022年 Visual Studio Code で Python 3.6 のデバッグ出来ない

## 結論

先に結論を書きます。

Visual Studio Code で Python 開発をするとき際に使用されるであろう Python 拡張機能（拡張機能ID `ms-python.python`、以下 `ms-python.python` と表記）は古いバージョンのデバッグすることができません。

> **TIP**
> 後述しますが、 v2022.18.2 時点ではデバッグが出来ないというのが正しいです。
> 将来的には古い Python バージョンでもデバッグ出来るようになるかもしれません。

`ms-python.python` と説明されても、Visual Studio Code の拡張機能をIDで識別する人はほとんどいないと思うので、拡張機能画面で表示した時の画像を添付します。

![ms-python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603173/4bd09b7b-a97c-f1f0-5987-e45e45896a38.png)

`ms-python.python` で Python 3.6 のデバッグをしたい場合は拡張機能のバージョンを v2022.8.1 に戻す必要があります。

Visual Studio Code の拡張機能画面から過去のバージョンに戻すためには「アンインストール」のリストから「別のバージョンをインストール」を選択、その後に表示されるバージョン検索バーに `2022.8.1` を入力して該当のバージョンの拡張機能をインストールします。

![install_other_version_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603173/53a15b75-2a98-6c96-79e7-cc4fe07f808b.png)

![install_other_version_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603173/7089015c-7624-b50e-a3db-d8afba0c3aff.png)

> **NOTE**
> あたりまえですが、拡張機能のバージョンが古いので該当のバージョン以降に追加された機能は利用できません。

- 2022/12/08 追記
    `ms-python.python` v2022.20.0 でサポートされていないバージョンの Python を使用している場合に警告ダイアログが表示されるようになりました。

## Visual Studio Code の Python 拡張機能でデバッグができない

記事を読んでいる方が似たような事象に遭遇した時、私が遭遇した問題と同じ原因か比較できるように情報を残します。

### 概要

2022年になってから Python 3.6 で動作しているソースコードを改修することになりました。

Python 3.6 は 2021年12月でセキュリティサポートも終了しています。
しかし、今回改修するのは本稼働中のスクリプトだったので、Python 事態のバージョンアップは行わずに改修だけを行うのが作業のスコープになっていました。

私は改修対象スクリプトの存在はしっていましたが、ソースコードを直接編集するのは初めてだったので Python スクリプト内にどういった機能があるのかは把握していませんでした。

残念ながらプログラム設計などに関するドキュメントは残されていなかったので、ある程度ソースコードを眺めたところでデバッグを行って動作を追いかけることにしました。

Visual Studio Code のデバッグ機能でデバッグ始めようとすると・・・、デバッグが出来ないことに気が付きました。
より正確には、デバッガーが起動した直後にデバッグが終了しているのが確認できます。

Visual Studio Code 上ではデバッグツールバーが１秒弱表示されたかと思うと、すぐに消えてしまうという状況でした。

デバッグ開始後にすぐに消えるデバッグツールバー:
![debug_toolbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603173/b9736c9f-0e23-0f61-ac89-b614eef969cb.png)

この時に Visual Studio Code 上でエラーメッセージが何も表示されることはありませんでした。

### 原因の切り分け

開発作業は Python 3.6 の Docker コンテナ上で行っていましたが、 Python 3.10 や Python 3.8 の Docker コンテナではデバッグが出来ていました。

何らかの差分でデバッグが出来ていないと予測して原因の切り分けを開始しました。

まず、そもそもスクリプトが正常に動作する環境が整えられていない可能性を考えて直接 Python コマンドでスクリプトを起動してみましたが、この方法だとスクリプトが実行できることが分かりました。

```shell
$ python aybabtu.py
```

次に `.vscode/launch.json` で指定している Python のデバッグ設定に問題が無いか確認しましたが、
Python 3.10 などのデバッグ構成との間に気になる差分がありませんでした。

```json:.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: aybabtu",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/aybabtu.py",
            "console": "integratedTerminal",
            "justMyCode": true
        }
    ]
}

```

続けて拡張機能の issue を確認すると、同じような問題に遭遇している方の issue が何件か見つかりました。

issue に書かれている内容を確認すると「`debugpy` のバージョンがアップグレードされた」ので「Python 3.6 のデバッグは出来ない」。
「拡張機能のバージョンを `v2022.8.*` にダウングレードするのが回避策」といったように案内されていました。

https://github.com/microsoft/vscode-python/issues/19531

https://github.com/microsoft/vscode-python/issues/19427

### Python 3.6 のデバッグが出来なくなった理由

issue などで名前が出てきていますが、 `ms-python.python` は Python のデバッグを行うときに [`debugpy`](https://github.com/microsoft/debugpy) というライブラリを使用しています。

> **TIP**
> このライブラリも `ms-python.python` と同じように Microsoft 社がメンテナンスしているようです。

`ms-python.python` は Typescript で書かれているけれど、デバッグの部分だけは `debugpy` に頼っているという形態のようです。

そして、`debugpy` の[このコミット](https://github.com/microsoft/debugpy/commit/1a6c323599085e4e19defc109a46be2b33faac9a) Python 3.6 サポートは打ち切ったようです。
このコミットが行われた次のリリースが `debugpy` v1.6.0 なので、これ以降のバージョンで Python 3.6 はデバッグが出来ないということになります。

拡張機能は `install_debugpy.py` というファイルで `debugpy` をダウンロードしているようなので、ソースコードを見ると `DEBUGGER_VERSION` という変数でバージョンが管理されています。

記事を執筆している時点の最終リリースバージョンの v2022.18.2 を見ると `DEBUGGER_VERSION = "1.6.3"` になっています。

https://github.com/microsoft/vscode-python/blob/2022.18.2/pythonFiles/install_debugpy.py:

```python
DEBUGGER_VERSION = "1.6.3"  # can also be "latest"
```

Python 3.6 がデバッグできる最後のバージョン v2022.8.1 を見ると `DEBUGGER_VERSION = "1.6.0"` になっています。

https://github.com/microsoft/vscode-python/blob/2022.8.1/pythonFiles/install_debugpy.py:

```python
DEBUGGER_VERSION = "1.6.0"  # can also be "latest"
```

`debugpy` は v1.6.0 で Python 3.6 のサポートを打ち切ったのにデバッグが出来るというのが気になりますが、サポートを打ち切ったバージョンでも暫くの間は動作するというのは、よくある話なので気にすることは無いでしょう。

### Python 拡張機能は古い Python バージョンのデバッグが出来なくなるのか

しかし、この実装方法だと `debugpy` がサポートを打ち切った Python バージョンは、`ms-python.python` でデバッグが出来なくなるという懸念があります。

残念ながら、2022年12月時点ではその状況にあります。

とはいえ、 `ms-python.python` もこの問題は当然認識しているので issue が存在しています。

https://github.com/microsoft/vscode-python/issues/19559

issue の内容としては実行環境の Python に合わせてダウンロードする `debugpy` のバージョンを変更する事で、古いバージョンの Python のデバッグもサポートしようという内容です。

この issue がクローズされたときに古い Python を最新の `ms-python.python` でデバッグ出来るようになっているといいな、という状態です。