python ではサブコマンドを実装したいときは、clickというパケージが便利です。
(参考:Python: コマンドラインパーサの Click が便利すぎた)
ただし、あるコマンドから他のコマンドの呼び方が解説されていなかったので、メモします。
clickの本サイトのadvances patternsで紹介されいていますが、日本語はないので簡単に紹介します。
test2 というコマンドから test1 というコマンドを呼びたい。って時です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # coding: utf-8 import click @click.group() def main(): pass @main.command("test1") @click.option("--age", default="55", type=int, help="your age") @click.option("--name", default="Sasaki", type=str, help="your name") @click.option("--desc", default="", required=False, type=str) def test1(desc, age, name): print("{} --> name:{} age:{}".format(desc, age, name)) @main.command("test2") @click.option("--age", default="20", type=int, help="your age") @click.option("--name", default="Toshi", type=str, help="your name") @click.pass_context def test2(ctx, age, name): ctx.forward(test1, desc="ctx.forward(test1)") ctx.invoke(test1, desc="ctx.invoke(test1)") ctx.forward(test1, name="Mike", desc="ctx.forward(test1, name='Mike')") ctx.invoke(test1, name="Mike", desc="ctx.invoke(test1, name='Mike')") if __name__ == "__main__": main() """ python click_test.py test2 > ctx.forward(test1) --> name:20 age:Toshi > ctx.invoke(test1) --> name:55 age:Sasaki > ctx.forward(test1, name='Mike') --> name:20 age:Mike > ctx.invoke(test1, name='Mike') --> name:55 age:Mike """ |
注目は黄色いラインと、
その下の他のコマンドを呼ぶ方の引数に ctx を書くこと。
forward と invoke の違いは、
forward は default で呼び出し元の引数を渡しますが、
invoke は呼び出された引数が default の引数となることです。
さようならー