QGIS Pugin デバッグ と リロード

# QGIS の Plugin をデバッグ方法と、ソースコードの変更を反映させる方法

QGIS の Plguin を開発していて、ソースコードを変更しても反映されない事があったので、ソースコードの反映方法をメモします。

[ソースコードの変更を反映方法だけを知りたい人はここだけ読んでください](#プラグインのソースコードの変更を反映する方法)

# 例、ElevationTile4JP という Plugin をデバッグする場合

開発中の ElevationTile4JPフォルダを、zip圧縮して、ElevationTile4JP.zip を作成します。



QGIS => MENU => プラグイン => プラグインの管理とインストール…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/71b14d85-28fd-42f1-a895-809dfdb356f1.png)

ElevationTile4JP.zip をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/67928827-78db-4d56-88ec-44164bc7019b.png)


C:\Users\username\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\ElevationTile4JP
ここに、ElevationTile4JP Plugin がインストールされます。

VSCode で、
C:\Users\username\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\ElevationTile4JP
をフォルダで開きます。


VSCode の 右下に表示されている インタープリターの選択、または、Python のバージョン番号をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/53417b82-f814-4306-8f4c-a8067a846466.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/72e52384-5367-4d99-bd58-b26260739152.png)

インタープリター パスを入力…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/c3f5be4d-ddf7-4ccd-8f36-e69d8951699f.png)

ファイルシステムを参照して Python インタープリターを検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/8b9e7cb5-85d4-47ac-b7d1-fa86d742b8f4.png)

インストールしている、Python.exe を選択します。
ここで、使っている QGIS Python.exe を選択すると、なぜか下で説明するプロセスにアタッチができなくなります、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/3aa2c8ea-ce80-4528-b5f4-82274c98b4ef.png)


.vscode\launch.json
を下記のように書きます。
```json
[
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach QGIS",
            "type": "debugpy",
            "request": "attach",
            "processId": "${command:pickProcess}",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "${env:APPDATA}/QGIS/QGIS3/profiles/default/python/plugins/ElevationTile4JP"
                }
            ],
            "justMyCode": true
        }
    ]
}
]
```

## プラグインのソースコードの変更を反映する方法
Plugin Reloader という QGIS の Plugin をインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/36fcd791-dbad-4c38-8a30-8ae6404b61d5.png)


プラグインの
```markdown
__init__.py
```
に、下記コードの、<=== START END ===> の範囲を追加します。


<font color="Red">重要 : このコードを追加することで、Plugin をリロードした時に、ソースコードの変更を反映できるようになります。</font> 
```python
import sys
import os
import importlib

sys.path.append(os.path.dirname(__file__))

# <=== START
base_dir = os.path.dirname(__file__)
for root, dirs, files in os.walk(base_dir):
    for file in files:
        if file.endswith(".py"):
            # 相対パスを取得
            rel_path = os.path.relpath(os.path.join(root, file), base_dir)
            # .py を外す
            mod_name = os.path.splitext(rel_path)[0]
            # ディレクトリの区切りを '.' に置き換えてモジュールパスに変換
            mod_name = mod_name.replace(os.path.sep, ".")

            # すでにインポートされているモジュールなら reload を試みる
            if mod_name in sys.modules and mod_name != "__init__":
                print(f"Reloading: {mod_name}")
                importlib.reload(sys.modules[mod_name])
# END ===>

def classFactory(iface):  # pylint: disable=invalid-name
    from elevation_tile_for_jp import ElevationTileForJP
    return ElevationTileForJP(iface)
```

<br>
VSCode で、実行とデバッグ ボタンを押して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/929f4d54-f6ff-43bb-af4e-a5e17db1f3b0.png)
Attach QGIS... をクリックします。

プロセスに接続 qgis-ltr-bin.exe を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/6b9726b6-c427-4b81-b378-819c39039ec0.png)


QGIS で、目的の Plugin この場合、ElevationTile4JPを リロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/307e10f0-a3ac-40ad-9f8c-fbc5939620b2.png)

ブレークポイントで止まるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/9050ab68-af55-4b6a-8b07-bfea48cd407f.png)

オリジナルソースコード、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/f4c5513a-7c24-47ad-8118-f2cb81c0a14b.png)

ソースコードを下記のように変更しても、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/f8e4ab1a-d230-4847-b687-02e42db9863a.png)

QGIS で、もう一度 ElevationTile4JPを リロードすれば、
変更したソースコードのブレークポイントで停止するようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143480/307e10f0-a3ac-40ad-9f8c-fbc5939620b2.png)