VSCode + Pipenv で Python Invoke をデバッグする


TL;DR

pipenv run which invoke の結果を launch.jsonprogram に指定

概要

サクッと CLI ツールを作るときには Python + Invoke が便利です。
Invoke を解説する記事はたくさんあるので、この記事では省略します。
本記事では、 VSCode で Invoke を用いた開発をする際にデバッグする方法を解説します。

環境

コードは Github に置きました。

デバッグ対象のコード

デバッグ対象として、フィボナッチ数の計算プログラムを用意しました。
num で受け取った数番目のフィボナッチ数を返却します。

tasks.py
#!/usr/bin/env python

from invoke import task


@task
def fibonacci(c, num):
    n = int(num)
    if n < 0:
        print("[Error]: num must be natural number or 0.")
        exit(1)

    print(calculate_fibonacci(n))

def calculate_fibonacci(num: int) -> int:
    if num < 0:
        raise ValueError("num must not be negative.")

    if num == 0:
        return 0

    if num == 1:
        return 1

    n_2 = 0 # fib[n-2]
    n_1 = 1 # fib[n-1]
    n = 1 # fib[n]

    for _ in range(1, num):
        n = n_2 + n_1
        n_2 = n_1
        n_1 = n

    return n

また、下記のコマンドで仮想環境を作成し、 invoke をインストールしました。

$ cd path/to/project
$ pipenv --python 3.7
$ pip install invoke

VSCode の設定

仮想環境

Pipfile が存在するディレクトリで code . を実行することで、 VSCode は自動的に仮想環境を認識します。

デバッグ

Debug -> Configure or Fix launch.json でデバッグ環境の設定を開きます。

launch.json.configurations[] にデバッグの設定を追加します。
今回は invoke fibonacci --num 10 をデバッグ実行するような設定にします。

invoke を用いたプログラムは tasks.pypython コマンドで直接起動せず、 invoke コマンドで起動します。
そのため、デバッガに指定するプログラムファイルは tasks.py ではなく invoke 自身になります。

invoke コマンド自身は Python プログラムになります。
invoke 自身は仮想環境にて管理されているため、下記のコマンドで探します。

$ pipenv run which invoke

この結果を launch.jsonprogram に指定することで、デバッグ実行可能になります。

{
    "name": "Python: Debug invoke fibonacci --num 10",
    "type": "python",
    "request": "launch",
    "program": "path/to/invoke", // `pipenv run which invoke` の結果を挿入
    "console": "integratedTerminal",
    "args": ["fibonacci", "--num", "10"]
}

これで Invoke を用いたプログラムも VSCode でデバッグ実行できるようになりました。

まとめ

今回は Invoke を用いたプログラムを VSCode でデバッグする方法を紹介しました。
Invoke に限らずエントリポイントをラップする種のライブラリも同様の方法でデバッグ実行可能になります。