🔥

fireとpoetryで作るcliアプリケーション

2021/06/26に公開

google/python-fire: Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.

cliアプリケーションフレームワークはClick等色々あるけど、fire(google製)はシンプルでわかりやすい。

ここではPoetryと組み合わせて使う方法を記録して行きます。

※この記事ではpoetryのインストール方法等は省略します。

プロジェクト作成

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

poetry new myapp
cd myapp
poetry add fire

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

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

コマンドの作成

公式のサンプルそのままですが、hello関数を作成し、fire.Fire(hello)とするだけでコマンドラインから実行できます。

import fire

def hello(name="World"):
    return "Hello %s!" % name


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

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

# 引数位置で指定
> python src/myapp/cli.py Japan
# 引数名で指定
> python src/myapp/cli.py --name Japan
# 省略形で指定
> python src/myapp/cli.py -n Japan

myappだけで起動できるようにif __name__ == "__main__":def main():に書き換えます。

import fire

def hello(name="World"):
    return "Hello %s!" % name


def main():
    fire.Fire(hello)

pyproject.tomlmyappを追記します。

[tool.poetry.scripts]
myapp = "myapp.cli:main"

これでpoetry installすればmyappだけで起動できるようになります。

> myapp Japan
Hello Japan!

サブコマンド化

例えばgitコマンドにはサブコマンドがあります。git statusgit commitのようにサブコマンドを設定すると呼び出せる関数は無限大に広がります。

cli.pyを書き換えます。

import fire

def hello(name="World"):
    return "Hello %s!" % name


def add(int1, int2):
    return int1 + int2


def main():
    fire.Fire({"hello": hello, "add": add})

add関数を追加してfire.Fire({"hello": hello, "add": add})とdictに変更しました。

サブコマンドとして呼んでみます。

> myapp hello Japan
Hello Japan!

> myapp add 1 2
3

グローバル化

この状態ではあくまで仮想環境のコマンドなので他の場所から呼び出せません。グローバルにインストールするため以下の手順を行います。

> poetry build
Building myapp (0.1.0)
  - Building sdist
  - Built myapp-0.1.0.tar.gz
  - Building wheel
  - Built myapp-0.1.0-py3-none-any.whl

これでdistディレクトリにビルドできましたので、これを使ってインストールします。今回はmyapp-0.1.0.tar.gzを使ってみますのでフルパスを控えておいてください。

cd
pip install /path/to/myapp/dist/myapp-0.1.0.tar.gz

pip installの部分は環境に応じてpip3 install等に変更してください。

これでどこからでもmyappコマンドが呼び出せるようになりました。

不要になったらpip uninstall myappで削除できます。

公式ではclassを使った方法等も書いてあるのでご参考に。

python-fire/guide.md at master · google/python-fire

GitHubで編集を提案

Discussion