QGIS3 の Python プラグイン開発環境構築 with VSCode (macOS)

QGIS のプラグインを VSCode 上で開発・リモートデバッグできるまでの環境を作成した際のメモです。環境は以下の通り。

- macOS Catalina 10.15.5
- Visual Studio Code 1.46.0
  - [Python 拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-python.python) をインストール済
- 適宜 Homebrew を使用

QGIS や Python にさほど明るいわけではないので、その点はひとつよしなに。

## QGIS のインストール

[オフィシャルサイト](https://www.qgis.org/ja/site/)からダウンロードしたインストーラー、もしくは Homebrew Cask でインストール。

```terminal
$ brew cask install qgis
```

ここでは最新版 (Version 3.12.3) をインストールしましたが LTS 版 (Version 3.10.6) でも以下の手順はアプリケーションパッケージの名前が異なる以外はほぼ同じです。

## いきなり QGIS プラグインを作ってみる

[GIS実習オープン教材](https://gis-oer.github.io/gitbook/book/index.html) の [プラグイン開発](https://gis-oer.github.io/gitbook/book/materials/python/10/10.html) のページを参考に、Plugin Builder 3 を使ってテスト用のプラグインを作成します。

プラグインを書き出す場所はデフォルトプロファイルのプラグインディレクトリ (*/Users/ユーザー名/Library/Application Support/QGIS/QGIS3/profiles/default/python/plugins*) とします。

プラグイン生成の段階でリソースコンパイラーが無いという旨のエラーが表示されますが、とりあえず書き出しは行われます。
<img width="417" alt="pyrcc5 error" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16187/63a891c5-0ff3-7ba6-a432-0063bcf184a9.png">

## PyQt のインストール

pyrcc5 が必要となったので、Homebrew で [PyQt](https://www.riverbankcomputing.com/software/pyqt/intro) をインストールします。

```terminal
$ brew install pyqt
```

依存関係で要求されるのが `python@3.8` ですが、さきほど作成したプラグインのリソースがコンパイルできればとりあえずOK。

```terminal
$ cd /Users/xxx/Library/Application\ Support/QGIS/QGIS3/profiles/default/python/plugins/plugin_test
$ pyrcc5 -o resources.py resources.qrc
```

「プラグイン」→「プラグインの管理とインストール...」メニューから作成したプラグインをアクティベートし、実行ができるところまで確認。
<img width="586" alt="テストプラグインの起動" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16187/1c5a01a5-8278-2266-38d6-d01d816b2f71.png">

## Python Tools for Visual Studio debug server のインストール

VS/VSCode 用の Python デバッガーパッケージである [ptvsd](https://github.com/Microsoft/ptvsd/) をインストールしたいのですが QGIS 付属の Python 用の pip が無い…

というわけでまず [PyPI の ptvsd パッケージページ](https://pypi.org/project/ptvsd/)へ行き、Download files から *ptvsd-4.3.2.zip* をダウンロード。

アーカイブを展開し、*ptvsd-4.3.2/src* 内の *ptvsd* フォルダを */Applications/QGIS3.12.app/Contents/Resources/python* 以下にコピー。（LTS 版の場合は *QGIS3.10.app*）

```terminal
$ cd ~/Downloads
$ unzip ptvsd-4.3.2.zip
$ cd ptvsd-4.3.2/src
$ cp -r ptvsd /Applications/QGIS3.12.app/Contents/Resources/python
```

QGIS を再起動し、`debugvs` プラグインをインストール。
インストールできたらプラグインメニューの [Enable Debug Visual Studio] もしくはツールバーのボタンを選択します。
<img width="724" alt="debugvs" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16187/2c2a1c13-e425-2227-7b6f-c30191e8d268.png">

「Remote Debug for Visual Studio is running」のメッセージが表示されればOK。
<img width="728" alt="Remote Debug for Visual Studio is running" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16187/30fb5f5a-3c16-1f58-cf0f-85dd3243eca3.png">

## VSCode からリモートデバッグ

先程作成したプラグインのディレクトリをワークスペースとして VSCode を起動。

```terminal
$ cd /Users/xxx/Library/Application\ Support/QGIS/QGIS3/profiles/default/python/plugins/plugin_test
$ code .
```

### Python interpreter の指定

（注：リモートデバッグだけに限れば不要？要確認）

コマンドパレットから「Python: Select Interpreter を実行し
<img width="441" alt="Select Interpreter" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16187/514b4a3e-db1f-2cc8-8247-da2b58795982.png">

「Enter interpreter path...」 を選択して */Applications/QGIS3.12.app/Contents/MacOS/bin/python3* を直接指定 （LTS 版の場合は QGIS3.10.app）
<img width="617" alt="Enter path" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16187/1ab760d9-1f86-dbfb-7c31-c4664a3aa6b1.png">

### デバッグ構成の追加

「実行」→「構成の追加...」メニューを選択し、リモートデバッグ用の構成を追加します。

環境の選択： Python
Debug Configuration: Remote Attach
Enter the host name: localhost
Enter the port number that ...(略): 5678

*.vscode/launch.json* に構成が追加されます。
そのままだとうまく動作しないので `pathMappings` の `remoteRoot` の値を "${workspaceFolder}" に修正します。

```json:launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: アタッチ",
      "type": "python",
      "request": "attach",
      "port": 5678,
      "host": "localhost",
      "pathMappings": [
        {
          "localRoot": "${workspaceFolder}",
          "remoteRoot": "${workspaceFolder}"
        }
      ]
    }
  ]
}
```

これで「実行」→「デバッグの開始」などでデバッグ実行を開始すると QGIS Python のデバッグサーバーにアタッチされます。試しにコード上の適当な場所にブレークポイントを置いてプラグインを実行するとデバッグが可能であることが確認できます。
<img width="766" alt="Break Point" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16187/a1fa043d-f42e-1ba7-e56f-e75d18db04f2.png">


これでなんとか慣れた環境で開発ができそうな予感。