clickをサポートする便利なモジュール
click の便利なところは、利用を手助けしてくれるモジュールが多いことがあります。
click-shell を使った会話形アプリケーション
click-shell を使うとサブコマンドを会話形でも実行することができるようになります。
拡張モジュールなので次のようにインストールします。
code: bash condaの場合
$ conda install click-shell
code: bash pipの場合
$ pip install click-shell
code: click_shell_demo.py
import click
from click_shell import shell
@shell(prompt="myapp > ", intro='Starting my app...')
def myapp():
pass
@myapp.command()
def initdb():
click.echo('Initialized the database')
@myapp.command()
def dropdb():
click.echo('Droped the database')
if __name__ == "__main__":
myapp()
code: bash
$ python click_shelldemo.py initdb
Initialized the database
$ python click_shelldemo.py dropdb
Droped the database
$ python click_shelldemo.py
Starting my app...
myapp > help
Documented commands (type help <topic>):
========================================
dropdb initdb
Undocumented commands:
======================
exit help quit
myapp > initdb
Initialized the database
myapp > dropdb
Droped the database
myapp > exit
click-spinner の使用例
click.progressbar()を使うとラベルなど設定できたり表現豊かなプログレスバーを実装することができます。
何かの処理中だということをユーザに示したいだけというのであれば、click-spinner を使う方が簡単です。click-spinner は拡張モジュールなのでインストールする必要があります。
code: bash condaの場合
$ conda install click-spinner
code: bash pipの場合
$ pip install click-spinner
まずは、例をみてみましょう。
code: click_spinner_demo.py
import time
import click
import click_spinner
@click.command()
def cli():
spinner = click_spinner.Spinner()
click.echo('Start:')
spinner.start()
time.sleep(10)
spinner.stop()
click.echo('End')
if __name__ == '__main__':
cli()
Spinnerクラスのインスタンスオブジェクトが持っている start() とstop() メソッドで対象の処理を挟むだけで、文字が回転してみるようなスピナーを表示してくれます。
click-lock で排他処理
click-lock モジュールを利用するとマルチユーザ環境などで必要になってくる排他処理を簡単に実装することができるようになります。
click-lock は拡張モジュールなのでインストールする必要があります。
code: bash condaの場合
$ conda install click-lock
code: bash pipの場合
$ pip install click-lock
まずは、例をみてみましょう。
code: click_lockdemo.py
import time
import click
import click_lock
@click.command()
@click_lock.lock
def cmd():
time.sleep(10)
if __name__ == '__main__':
cmd()
code: bash
$ python click_lockdemo.py --help
Options:
--lock fname Path to lock file
--timeout seconds Limit script execution time
--trace / --no-trace Log traceback in case of timeout default: True --help Show this message and exit.
click-lock はどういう仕組でclick を拡張しているのかがよく分かる良いサンプルにもなります。
@clock-lock.lockの実装は次のようになっています。
code: @click-lock.lock の抜粋
def lock(func):
@click.option('--lock', help='Path to lock file', metavar='fname')
@click.option('--timeout', type=int, metavar='seconds',
help='Limit script execution time')
@click.option('--trace/--no-trace', default=True,
show_default=True,
help='Log traceback in case of timeout')
@click.pass_context
@functools.wraps(func)
def inner(ctx, *args, **kwargs):
lock = kwargs.pop('lock', None)
timeout = kwargs.pop('timeout', None)
trace = kwargs.pop('trace', None)
lock and _set_lock(lock)
timeout and _set_timeout(timeout, trace)
return ctx.invoke(func, *args, **kwargs)
return inner
これを模倣すると、よく使うオプション処理をまとめたデコレータを作成できますね。
click-paramsの使用例
click-params は、click のオプション引数でチェックできるtypeが増えます。
拡張モジュールなので次のようにインストールします。
code: bash condaの場合
$ conda install click-params
code: bash pipの場合
$ pip install click-params
click-params で追加されるパラメタタイプ
DOMAIN: ドメイン名
DomainListParamType:ドメイン名のリスト
PUBLIC_URL:URL(10.0.0.1などプライベートIPは受け付けない)
PublicUrlListParamType: PUBLIC_URLのリスト
URL: URL (10.0.0.1などプライベートIPは受け付ける)
UrlListParamType: URLのリスト
EMAIL:email アドレス
EmailListParamType:emailアドレスのリスト
SLUG: マイナス記号(-)で区切られた文字列(xxx-yyy のような文字列)、マイナス記号はなくてもよく、また複数あってもよい。マイナス記号以外は受け付けない。
SlugListParamType:SLUGのリスト
IP_ADDRESS:IPアドレス
IpAddressListParamType:IPアドレスのリスト
IPV4_ADDRESS:IPv4アドレス
Ipv4AddressRange:IPv4アドレスの範囲指定
Ipv4AddressListParamType:IPv4アドレスのリスト
IPV6_ADDRESS:IPv6アドレス
Ipv6AddressRange:IPv6アドレスの範囲指定
Ipv6AddressListParamType:IPv6アドレスのリスト
IP_NETWORK:ネットワークアドレス
IpNetworkListParamType:ネットワークアドレスのリスト
IPV4_NETWORK:IPv4ネットワークアドレス
Ipv4NetworkListParamType:IPv4ネットワークアドレスのリスト
IPV6_NETWORK:IPv6ネットワークアドレス
Ipv6NetworkListParamType:IPv6ネットワークアドレスのリスト
FRACTION:分数、0.2、1/5 などを受け付ける
FractionRange:分数の範囲指定
FractionListParamType:分数のリスト
DECIMAL:10進の整数
DecimalRange:10進の整数の範囲指定
DecimalListParamType:10進の整数のリスト
COMPLEX:虚数
ComplexListParamType:虚数のリスト
IntListParamType:自然数のリスト
FloatListParamType:浮動小数点のリスト
どれも @click.option() の type に与えるもので、ほぼ同じ使い方になるため、
2例だけをあげておきます。
code: click_params_domain.py
import click
from click_params import DOMAIN
@click.command()
@click.option('-d', '--domain', type=DOMAIN)
def cmd(domain):
click.echo(f'Your domain is {domain}')
if __name__ == '__main__':
cmd()
code: bash
$ python click_params_domain.py --help
Usage: click_params_domain.py OPTIONS Options:
-d, --domain DOMAIN NAME
--help Show this message and exit.
$ python click_params_domain.py --domain google.com
Your domain is google.com
$ python click_params_domain.py --domain google
Usage: click_params_domain.py OPTIONS Try "click_params_domain.py --help" for help.
Error: Invalid value for "-d" / "--domain": google is not a valid domain name
DomainListParamType
code: click_params_domainlist.py
import click
from click_params import DomainListParamType
@click.command()
@click.option('-d', '--domains',
type=DomainListParamType(' '),
help='list of domain names separated by a white space')
def cmd(domains):
click.echo('Your list of domain names:')
for domain in domains:
click.echo(f'- {domain}')
if __name__ == '__main__':
cmd()
code: bash
$ python click_params_domainlist.py --help
Usage: click_params_domainlist.py OPTIONS Options:
-d, --domains DOMAIN NAME LIST list of domain names separated by a white
space
--help Show this message and exit.
$ python click_params_domainlist.py --domains='foo.com bar.com'
Your list of domain names:
- foo.com
- bar.com
$ python click_params_domainlist.py --domains=foo.com
Your list of domain names:
- foo.com
$ python click_params_domainlist.py --domains=foo
Usage: click_params_domainlist.py OPTIONS Try "click_params_domainlist.py --help" for help.
Error: Invalid value for "-d" / "--domains": These items are not domain names: 'foo' トリビア: SLUG
SLUGのもともとの意味はナメクジなのですが、ソフトウェア界隈で使用される場合は、
人が判読できるIDとして使われます。SLUGはマイナス記号(-)で区切られた文字列です。
マイナス記号がなく単に文字列でも構いませんが、マイナス記号(-)以外は使えません。
click-config-file の使用例
click-config-file は pip でインストールします。
code: bash
$ pip install click-config-file
使い方は簡単で、@click_config_file.configuration_option() でデコレートするだけです。
code: python
import click
import click_config_file
@click.command()
@click.option('--name', default='World', help='Who to greet.')
@click_config_file.configuration_option()
def hello(name):
click.echo(f'Hello {name}!')
if __name__ == '__main__':
hello()
オプション --config に与えたファイルを読み取ってくれます。
code: bash
$ python click_config_file_demo1.py --help
Usage: click_config_file_demo1.py OPTIONS Options:
--name TEXT Who to greet.
--config FILE Read configuration from FILE.
--help Show this message and exit.
$ python click_config_file_demo1.py
Hello World!
$ echo "name='Python'" > my.config
$ python click_config_file_demo1.py --config=my.config
Hello Python!
設定ファイルがオプションで与えられていないときは、config ファイルをプラットフォームに応じた設定ファイルの配置場所から探します。
この配置場所は、click.get_app_dir() によって知ることができます。
code: python
import click
print(click.get_app_dir('hello))
Linux
$HOME/.config/hello
Mac:
$HOME/Library/Application Support/hello
Win XP
C:\Documents and Settings\<user>\Application Data\hello
Win 7
C:\Users\<user>\AppData\Local\hello