LoginSignup
0
2

More than 3 years have passed since last update.

click で group を分割 + pass_context で共通化オプションを設定する

Last updated at Posted at 2021-03-24

Overview

python の cli コマンドツールの click で、

  • サブコマンド用にファイルを分割する方法
  • 分割したサブコマンドに共通オプションを渡す方法

のやり方。

コード

files
mycommand/
├── cli1.py
├── cli2.py
└── cmd.py
mycommand/cmd.py
"""
エントリポイント
"""
import click

# サブコマンド ファイル分割
from . import cli1  # サブコマンド 1
from . import cli2  # サブコマンド 2

@click.command(cls=click.CommandCollection, sources=[cli1.cli1, cli2.cli2])
@click.option('--debug/--no-debug', default=False)  # 全サブコマンドに共通のオプション
@click.pass_context
def cli(ctx, debug):
    """エントリポイント"""
    ctx.obj = {'debug': debug}

if __name__ == '__main__':
    cli()
mycommand/cli1.py
"""
サブコマンド 1
"""
import click

cli1 = click.Group()

@cli1.group()
@click.option('--verbose/--no-verbose', default=False, envvar="VERBOSE")  # cli1_grp1_cmd1 / cli1_grp1_cmd2 に共通のオプション
@click.pass_obj
def cli1_grp1(obj, verbose):
    """サブコマンド1"""
    obj['verbose'] = verbose

@cli1_grp1.command()
@click.option('-o', '--opt')  # cli1_grp1_cmd1 のオプション
@click.pass_obj
def cli1_grp1_cmd1(obj, opt):
    """サブコマンド1-コマンド1"""
    print(locals())

@cli1_grp1.command()
@click.option('-o', '--opt')  # cli1_grp1_cmd2 のオプション
@click.pass_obj
def cli1_grp1_cmd2(obj, opt):
    """サブコマンド1-コマンド2"""
    print(locals())
mycommand/cli2.py
"""
サブコマンド 2
"""
import click

cli2 = click.Group()

@cli2.command()
@click.option('-v', '--value')  # cli2_cmd1 のオプション
@click.pass_obj
def cli2_cmd1(obj, value):
    """サブコマンド2-コマンド1"""
    print(locals())

実行

エントリポイント
$ python -m mycommand.cmd
Usage: cmd.py [OPTIONS] COMMAND [ARGS]...

  エントリポイント

Options:
  --debug / --no-debug
  --help                Show this message and exit.

Commands:
  cli1-grp1  サブコマンド1
  cli2-cmd1  サブコマンド2-コマンド1
サブコマンド1
$ python -m mycommand.cmd cli1-grp1
Usage: cmd.py cli1-grp1 [OPTIONS] COMMAND [ARGS]...

  サブコマンド1

Options:
  --verbose / --no-verbose
  --help                    Show this message and exit.

Commands:
  cli1-grp1-cmd1  サブコマンド1-コマンド1
  cli1-grp1-cmd2  サブコマンド1-コマンド2
サブコマンド1-コマンド1
$ VERBOSE=1 python -m mycommand.cmd --debug cli1-grp1 cli1-grp1-cmd1 --opt 123
{'obj': {'debug': True, 'verbose': True}, 'opt': '123'}
0
2
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
0
2