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'}