fireとpoetryで作るcliアプリケーション
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.toml
にmyapp
を追記します。
[tool.poetry.scripts]
myapp = "myapp.cli:main"
これでpoetry install
すればmyapp
だけで起動できるようになります。
> myapp Japan
Hello Japan!
サブコマンド化
例えばgitコマンドにはサブコマンドがあります。git status
やgit 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を使った方法等も書いてあるのでご参考に。
Discussion