QGISプラグインをVS Codeの支援を受けながら開発したい！

QGISプラグインの開発を得意分野の１つとする我々が普段 Visual Studio Code (VS Code) 上で効率良くプラグインを開発するのに欠かせないテクニックとして、今回は**VS Codeのコード補完と型チェック**を機能させながらプラグインを開発する方法を紹介します。

うまく設定すると、下図のように VS Code（というかPythonの言語サーバ）による支援を受けながらQGISプラグインを開発できます。**控え目に言って最高です**。

![Screenshot 2023-07-20 at 16.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/3ad43c6b-fcbe-320e-08d5-4078b69a1d3b.png)
![Screenshot 2023-07-20 at 16.58.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/df63229c-faa8-8b95-0bb4-e4b66cab4be3.png)

コード補完や引数などの情報が得られるだけでなく、型チェックや静的解析も機能するようになるため、コードの品質も少なからず良くなるでしょう。

![Screenshot 2023-07-20 at 17.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/5bae4c69-cbc6-55b1-de56-d22965ebc307.png)

これらのコード補完や型チェックなどが開発体験において重要であることは、現代のプログラマの皆さんには説明するまでもありません（！？）。

## コード補完や型ヒントを機能させる

通常、VS Code 上で QGIS プラグインを開発する際には、最重要のライブラリである PyQGIS と PyQt5 に関して**コード補完が一切効かない**という問題があります。これは、PyQGIS や PyQt5 が QGIS 内蔵の特別なPython環境に閉ざされており、VS Code の言語サーバがそのPython環境を自動で認識できないためです。

この問題を解決するには、VS CodeにQGIS内蔵のPython環境を認識させる必要がありますが、実はこれは Python に標準で備わっている「仮想環境」（virtual environment、**venv**）の仕組みを利用すれば上手く実現することができます。

なお、Pythonの venv をそのまま使っても実現できますが、我々はワークフローをシンプルにするために **Poetry** というパッケージ管理ツールを介して venv を使っています。Poetry の使い方や概念ついてはここでは説明しません。ごめんなさい。

:::note warn
追記：2024年末現在は Poetry ではなく [uv](https://docs.astral.sh/uv/) を使っています。記事を更新できていません。
:::

以下に、Poetry を使って QGIS のPython環境をVS Codeに認識させる手順を示します。 まずは macOS での設定方法から紹介して、次に、Windows での設定方法も示します。

### macOS での設定方法

プロジェクトを作りたいディレクトリ内で、以下のコマンドを実行してください：

```bash
# poetry をインストールしていない方はインストールしてください。
pip3 install poetry -U

# 仮想環境 (.venv) をプロジェクトフォルダ内に作るように設定します。
poetry config --local virtualenvs.in-project true

# QGISのPython環境に含まれているパッケージ (qgis, PyQt5 など) を
# 今回作る仮想環境 (venv) に引き継ぐ設定をします。(重要)
poetry config --local virtualenvs.options.system-site-packages true

# 新規プロジェクトをセットアップします。
poetry init

# QGIS に内蔵されたPythonを使うようにPoetryに指示します。(重要)
poetry env use /Applications/QGIS.app/Contents/MacOS/bin/python3

# 仮想環境を構築します。
poetry install

# プロセッシングフレームワークなどの特殊な QGIS 内蔵 Python パッケージを
# 認識させたい場合は以下も実行してください。
echo /Applications/QGIS.app/Contents/Resources/python/plugins > .venv/lib/python3.9/site-packages/qgis_std_plugins.pth
```

これで完了です。（実際の運用では手作業でなく何らかの自動化をすべきでしょう）

あとは、VS Codeのコマンドパレットで "Python: Select Interpreter" を実行して、 .venv 内のPython環境を選択すればOKです。

![Screenshot 2023-07-20 at 16.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/12ab02d2-a690-c1cc-adc4-f73712adaeef.png)

PyQGIS や PyQt5 について、VS Code の支援を受けられるようになっているか確認してみてください。

![Screenshot 2023-07-20 at 22.12.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/715e17c8-2d96-504f-12b0-b213f969146a.png)

### Windows (OSGeo4W版) での設定方法

次にWindowsにおける設定方法を解説します。mac版のときとは若干違うアプローチをとります。

:::note info
Windows用のQGISビルドは複数あり、構成などがそれぞれ異なります。ここでは OSGeo4W 版の QGIS LTR を例にして説明します。
:::

コマンドプロンプトで以下の手順を実行してください。それぞれの意味はコメントを参考にしてください。

```bat
@rem QGISのPython環境を使ってPoetryをインストールします。
C:\OSGeo4W\bin\python-qgis-ltr.bat -m pip install poetry

@rem 仮想環境 (.venv) がプロジェクトフォルダ内に作られるようにします。
C:\OSGeo4W\bin\python-qgis-ltr.bat -m poetry config --local virtualenvs.in-project true

@rem QGISに含まれているパッケージを今回作る仮想環境 (venv) に引き継ぐ設定をします。
C:\OSGeo4W\bin\python-qgis-ltr.bat -m poetry config --local virtualenvs.options.system-site-packages true

@rem 仮想環境を新規に作ります
C:\OSGeo4W\bin\python-qgis-ltr.bat -m poetry init

@rem Windows用QGISには PyQt5 の型スタブが同梱されていないため、
@rem 追加でインストールします
C:\OSGeo4W\bin\python-qgis-ltr.bat -m poetry add -G dev pyqt5-stubs

@rem 仮想環境を構築します
C:\OSGeo4W\bin\python-qgis-ltr.bat -m poetry install

@rem Windows版のQGISでは、Pythonパッケージが特殊な場所に配置されているため、それらにパスを通します。
C:\OSGeo4W\bin\python-qgis-ltr.bat -c "import pathlib;import qgis;open('.venv/Lib/site-packages/qgis.pth', 'w').write(str((pathlib.Path(qgis.__file__)/'../..').resolve()) + '\n' + str((pathlib.Path(qgis.__file__)/'../../plugins').resolve()))"
```

（実際の運用では手作業でなく何らかの自動化をすべきでしょう）

これで Windows でも PyQGIS と PyQt5 のコード補完が効くようになるはずです。

![Screenshot 2023-07-20 at 22.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/82dc8d4f-f724-e992-4743-42838ac5c828.png)

## 追記: 参考になりそうな記事

先人の皆さんが書かれた記事を見つけたので紹介しておきます。

https://gispofinland.medium.com/cooking-with-gispo-qgis-plugin-development-in-vs-code-19f95efb1977

https://nujust.hatenablog.com/entry/2023/06/11/003337

## 参考リポジトリ

弊社が開発してオープンソースライセンスで無償公開しているQGISプラグインのリポジトリでも、上述したような VS Code の支援受けるための設定を施してあります。具体的なコードを参考にしたい場合はご覧ください。

この記事で手動で行っている操作を、 Makefile で半自動化したりもしています。

https://github.com/MIERUNE/qgis-mojxml-plugin

↑は[法務省登記所備付地図データ](https://front.geospatial.jp/moj-chizu-xml-download/)をQGISで読み込むためのプラグインです。

今回は説明しませんでしたが、上手く設定することでQGISのPython環境を使ったテスト自動化なども実現できます。そのあたりはまた今後。