テクめも

プログラミング関連のちょっとしたTipsなどを書いています。

Clickでコマンド別にファイル分割する

PythonのCLIフレームワークの1つにclickがあります。

デコレータを使って簡単にCLIが作成できますが、1ファイルにすべてのコマンドのコードを書いていくと長くなります。 そこで、CommandCollectionを使って複数のコマンドをマージすることで、コマンド別にファイルを分割する方法を紹介します。

まず、コマンド別のファイルを用意します。

# cli1.py
import click

@click.group()
def cli1():
    pass

@cli1.command()
def cmd1():
    """Command on cli1"""
# cli2.py
import click

@click.group()
def cli2():
    pass

@cli2.command()
def cmd2():
    """Command on cli2"""

次に、この2つのコマンドをマージします。

# main.py
import click

from .cli1 import cli1
from .cli2 import cli2

@click.command(cls=click.CommandCollection, sources=[cli1, cli2])
def cli():
    pass

if __name__ == '__main__':
    cli()

実行すると以下のように、マージされていることが分かります。

$ cli --help
Usage: cli [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  cmd1  Command on cli1
  cmd2  Command on cli2

参考

Commands and Groups — Click Documentation (7.x)