13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SENSYAdvent Calendar 2018

Day 4

clickではじめる社内コマンドツール -その1-

Last updated at Posted at 2018-12-03

業務中に繰り返し行う作業を社内コマンドとしてまとめています。
その中で共有できそうな知見がいくつか出てきたので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なら.bashrceval "$(_HELLO_COMPLETE=source hello)"
  • zshなら.zshrceval "$(_HELLO_COMPLETE=source_zsh hello)"

ここではevalを直接実行して一時的に有効化して試しています。

# .zshrcに書くのがいい
$ eval "$(_HELLO_COMPLETE=source_zsh hello)"
$ hello -n<TAB>  # これで ame  が補完されます

まとめ

今回はclickの紹介をしました。
次回からはシリーズとして実際にclickを使っていく中でためた知見を共有できればと思っています。次回はまずサブコマンドの作り方を中心に紹介します。
clickは使ってみると本当に簡単で便利なので是非作ってみてください。

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?