3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

clickを使ってサブサブコマンドを作る - netsted sub-sub command -

Posted at

概要

pythonでコマンドライン解析ツールを使ってコマンドラインツールを作る場合、用いられるモジュールは大きく分けて以下の3つ。

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
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?