### Pythonのコマンドラインツール作成用ライブラリ「Click」がすげぇ便利
---
Clickとは
https://github.com/pallets/click
---
CLIツールを作成するためのライブラリ
- 標準ライブラリだと「argparse」
---
何がいいのか
→めっちゃ実装が楽
---
- argparse
```
import argparse
def main():
parser = argparse.ArgumentParser(description='Simple argparse CLI')
parser.add_argument('-n', '--name', dest='name', type=str, help='your name', required=True)
args = parser.parse_args()
print(f"Your name is {args.name}")
if __name__ == '__main__':
main()
```
---
- ArgumentParserクラスでコマンドラインパーサーを定義
- add_argumentメソッドでオプションを追加
- 作成したAugumentParserインスタンスからparse_argsメソッドで引数を取り出す
---
- 実行してみる
```
% pipenv run python argparse_sample.py -n nishio
Your name is nishio
```
---
- click
```
import click
@click.command(help='Simple click CLI')
@click.option('-n', '--name', 'name', type=str, help='your name', required=True)
def main(name):
print(f"Your name is {name}")
if __name__ == '__main__':
main()
```
---
- click.commandデコレータをメソッドに設定することで、コマンド指定時にコールするメソッドを決定
- click.optionデコレータによりオプションを追加
---
- 実行してみる
```
% pipenv run python click_sample.py -n nishio
Your name is nishio
```
---
サブコマンドの実装も簡単
---
- argperser(サブコマンド)
```
import argparse
def command_name(args):
print(f"Your name is {args.name}")
def get_parser():
parser = argparse.ArgumentParser(description='Subcommand argparse CLI')
subparsers = parser.add_subparsers()
name_parser = subparsers.add_parser('name', help='your name')
name_parser.add_argument('-n', dest='name', type=str, required=True)
name_parser.set_defaults(handler=command_name)
return parser
def main():
parser = get_parser()
args = parser.parse_args()
if hasattr(args, 'handler'):
args.handler(args)
else:
parser.print_help()
if __name__ == '__main__':
main()
```
---
- add_subparsersメソッドにより子parserのグループを作成
- add_parserメソッドによりサブコマンドを作成
- サブコマンドをネスト
- サブコマンドとコールする関数を紐付け
---
- 実行してみる
```
% pipenv run python argparse_subcommand_sample.py name -n nishio
Your name is nishio
```
---
- click(サブコマンド)
```
import click
@click.group()
def cmd():
pass
@cmd.command(help='Subcommand argparse CLI')
@click.option('-n', '--name', 'name', type=str, help='your name', required=True)
def name(name):
click.echo(f"Your name is {name}")
def main():
cmd()
if __name__ == '__main__':
main()
```
---
- click.groupデコレータによりサブコマンドのグループを定義します。argparseと違ったサブコマンドのグループで共通処理を書ける
- サブコマンドをネスト
---
- 実行してみる
```
% pipenv run python click_subcommand_sample.py name -n nishio
Your name is nishio
```
{"metaMigratedAt":"2023-06-15T19:09:50.313Z","metaMigratedFrom":"Content","title":"Untitled","breaks":true,"contributors":"[{\"id\":\"501938f7-150f-4a68-b27a-4907062f3c90\",\"add\":5103,\"del\":2537}]"}