🔥

fireとpoetryで作る自分用cliアプリケーション(2022)

2022/10/25に公開約2,200字

定型作業や自作ツールを使うときにコマンド1発で使用できると便利です。

例えば、URLにアクセスしてデータをダウンロードしDBにぶち込むなどなど。

以前にこのような記事を投稿したことがあるのですが欠点がありました。

https://zenn.dev/atu4403/articles/b776a9f2b7a516d195d1

公開できるCLIアプリケーションという前提でしたので、汎用的に使える一方で細かな修正が面倒でした。

なので今回は「自分が使えればOK」という観点で書き直してみたいと思います。

プロジェクト作成

例としてmyappというコマンドを作成します。myappの部分は好きに命名してください。

poetry new myapp
cd myapp
poetry add fire

myappディレクトリにcli.pyというファイルを作成します。poetryの設定によりsrcディレクトリが無い場合もあります。

├── src
│   └── myapp
│       ├── __init__.py
│       └── cli.py
└── tests
    └── __init__.py

コマンドの作成

import fire


class Calculator(object):
    def __init__(self, detail=False) -> None:
        self.detail = detail

    def add(self, x, y, offset=0):
        x, y = x + offset, y + offset
        if self.detail:
            return f"{x} + {y} = {x+y}"
        return x + y

    def mul(self, x, y):
        if self.detail:
            return f"{x} * {y} = {x*y}"
        return x * y


if __name__ == "__main__":
    fire.Fire(Calculator)

poetry shellで仮想環境に入り、cli.pyを実行するとコマンドライン引数を受け取って関数が走ります。

# examples
> python src/myapp/cli.py add 2 3
5
> python src/myapp/cli.py add 2 3 --detail --offset=1
3 + 5 = 8

この場合、--detailは全ての関数に付けられるオプション、--offsetはadd関数のみに付けられるオプションになります。

コマンドを使いやすくする

前回は、どこからでも使用できるように「ビルドしてからインストール」という方法を解説しました。
しかしこれは、コマンドを修正する度にやり直す必要があるので、自分で使うには不便です。

今回は「shell関数にする」という方法で行います。fishの例ですが他のshellでも概念は同じです。

function mytools
    pythonインタプリタのフルパス cli.pyのフルパス $argv
end

mytoolsというコマンドで使用すると仮定します。pythonインタプリタのフルパスwhich pythonで取得できます。(仮想環境の場合はpoetry shell等でアクティベートすることを忘れないでください)

ドキュメントの作成

fireは--helpオプションが自動で作成されるのですが微妙に読みにくいです。なのでREADME.mdなどにわかりやすいドキュメントを作成します。
これをブラウザで開くコマンドを作成します。

def doc(self):
    from pathlib import Path
    readme = Path(__file__).parent / "../README.md"
    subprocess.Popen(
        ["open", "-a", "/Applications/Google Chrome.app", readme.resolve()]
    )

この場合は/Applications/Google Chrome.appで開きます。必要に応じて変更してください。

実行するために以下の設定が必要になります。

ブラウザ(chrome系)に機能拡張を追加

chrome系だとMarkdown Preview Plusを追加するとmarkdownを見やすい感じで開くことができます。

以上を設定するとmytools docのようなコマンドで簡単にドキュメントを開くことができます。

GitHubで編集を提案

Discussion

ログインするとコメントできます