概要
pythonでコマンドライン解析ツールを使ってコマンドラインツールを作る場合、用いられるモジュールは大きく分けて以下の3つ。
- argparse
- click
- fire
argparseは標準ライブラリと言うことで何も考えずに使えるという利点がありclickは標準モジュールではない故に標準ライブラリでは実装しづらい事を簡単に実装できるようになっている。
なお、fireについては使ったことがないのと、コマンドライン解析ツールの紹介を目的としている記事ではないのでここではこれ以上の比較・説明は割愛する。
clickを使ったサブコマンドの作成方法
clickを使ったサブコマンドの作成方法は以下の通り。
実際に動作するプログラムを作るならば以下のようになる。
import click
@click.group()
def cli():
pass
@cli.command()
def initdb():
click.echo('Initialized the database')
@cli.command()
def dropdb():
click.echo('Dropped the database')
def main():
cli()
if __name__ == "__main__":
main()
$ python3 cli.py
Usage: cli.py [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
dropdb
initdb
$ python3 cli.py dropdb
Dropped the database
$ python3 cli.py dropdb --help
Usage: cli.py dropdb [OPTIONS]
Options:
--help Show this message and exit.
$ python3 cli.py initdb --help
Usage: cli.py initdb [OPTIONS]
Options:
--help Show this message and exit.
$ python3 cli.py initdb
Initialized the database
サブサブコマンドの作り方
上記は program command <options>
とする場合の作り方がだが
昨今のkubectl等は kubectl get pods <options>
のようにサブコマンドを二つ受け取るような物が増えてきている。
従って自身が作る場合はどのようにすれば良いか。
clickのドキュメントを読んでもサブコマンドの作り方は書いてあるがサブサブコマンドの作り方は書いていない。
いくつかドキュメントやWebを探し回って以下の方法が綺麗だと思ったので作ってみた。
.
├── modules
│ ├── sub1.py
│ └── sub2.py
└── cli.py
import click
from modules import sub1
from modules import sub2
@click.group()
def cli():
pass
def main():
cli.add_command(sub1.sub1cli)
cli.add_command(sub2.sub2cli)
cli()
if __name__ == "__main__":
main()
import click
@click.group()
def sub1cli():
pass
@sub1cli.command()
def sub1cmd1():
click.echo('sub1cmd1')
@sub1cli.command()
def sub1cmd2():
click.echo('sub1cmd2')
import click
@click.group()
def sub2cli():
pass
@sub2cli.command()
def sub2cmd1():
click.echo('sub2cmd1')
@sub2cli.command()
def sub2cmd2():
click.echo('sub2cmd2')
このように、clickの add_command でclick.groupを追加してやると作れる。
$ python3 cli.py
Usage: cli.py [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
sub1cli
sub2cli
$ python3 cli.py sub1cli
Usage: cli.py sub1cli [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
sub1cmd1
sub1cmd2
$ python3 cli.py sub2cli
Usage: cli.py sub2cli [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
sub2cmd1
sub2cmd2