業務中に繰り返し行う作業を社内コマンドとしてまとめています。
その中で共有できそうな知見がいくつか出てきたのでSENSY Advent Calendar 2018で数回に分けて紹介していきます。
第一回目は、CLIツール作成のために利用しているPython製ライブラリのclickを紹介します。
- 第ニ回目: サブコマンドの作り方
clickの紹介
clickは、Flaskをサポートするために作られたCLI作成ライブラリです。
CLIツール作るなら絶対これ!ってくらいめちゃくちゃおすすめです。
個人的には下記のような点が気に入っているためよく使っています。
- ミニマルに始められる
- デコレータでコマンドやオプションを増やせる
- サブコマンドも作れる
- 対話形式やエディタの起動も簡単
最小限のコードで始める
ドキュメントの出てくるコードを参考に最小コードを書くとこのようになります。
import click
@click.command()
def cli():
click.echo('Hello World!')
if __name__ == '__main__':
cli()
たったこれだけでCLIツールができあがります。素敵ですね。
$ python hello.py
Hello World!
オプションを追加するのも1行追加するだけでとても直感的です。
import click
@click.command()
@click.option('--name', '-n', help='The person to greet.')
def cli(name):
click.echo(f'Hello {name}!')
if __name__ == '__main__':
cli()
動作結果はこちら。
$ python hello.py --name rhoboro
Hello rhoboro
$ python hello.py -n rhoboro
Hello rhoboro
setup.pyでコマンド化
せっかくCLIツールを作ったのにいつもpython hello.py
と打って起動するのは少し面倒ですよね。そこでsetup.py
を書いてpip install
できるようにしましょう。
下記はドキュメントにあるコードをコピペして名前を変えただけです笑
from setuptools import setup
setup(
name='hello',
version='0.1',
py_modules=['hello'],
install_requires=[
'Click',
],
entry_points='''
[console_scripts]
hello=hello:cli
''',
)
さきほど作ったhello.py
とこのsetup.py
を同じディレクトリにいれてpip install
します。pipの-e
オプションはコードの修正を即時反映するためのオプションです。開発中は利用しておくと便利です。
# ここでは仮想環境を用意してグローバルへのインストールを避けてます
$ python3 -m venv venv
$ . venv/bin/activate
# インストール
(venv) $ pip install -e .
(venv) $ hello -n rhoboro
Hello rhoboro!
hello
だけで動くようになりました!素晴らしい!
コマンドの補完
ありがたいことにbashとzshであればコマンド補完も簡単に実現できます。ちなみに、コマンド補完はインストールしている時のみ利用できます。
詳細はドキュメントにありますが下記を書くだけです。
- bashなら
.bashrc
にeval "$(_HELLO_COMPLETE=source hello)"
- zshなら
.zshrc
にeval "$(_HELLO_COMPLETE=source_zsh hello)"
ここではevalを直接実行して一時的に有効化して試しています。
# .zshrcに書くのがいい
$ eval "$(_HELLO_COMPLETE=source_zsh hello)"
$ hello -n<TAB> # これで ame が補完されます
まとめ
今回はclickの紹介をしました。
次回からはシリーズとして実際にclickを使っていく中でためた知見を共有できればと思っています。次回はまずサブコマンドの作り方を中心に紹介します。
clickは使ってみると本当に簡単で便利なので是非作ってみてください。