引言
由于click库网上资料不同的版本不多,基本雷同,本篇主要介绍将官网文档基础和网上版本结合起来,记录click库的基础与中级应用部分
- 基础部分
import click
@click.group()
def cli():
pass
@click.command()
def initdb():
click.echo('Initialized the database')
@click.command()
def dropdb():
click.echo('Dropped the database')
cli.add_command(initdb)
cli.add_command(dropdb)
cli()
注释与说明:
- 将上述代码保存为文件AA.py ,在终端执行命令python AA.py initdb或者在终端执行命令python AA.py dropdb都可以分别正确的执行initdb和dropdb两个命令。
- 这种方法不可同时执行。如果希望同时执行两个命令,修改如下:
import click
@click.group()
def cli():
print("---")
pass
@cli.group()
def initdb():
click.echo('Initialized the database')
@initdb.command()
def dropdb():
click.echo('Dropped the database')
cli()
说明与注释:
- 将上述代码保存为文件BB.py ,在终端执行命令python BB.py initdb dropdb
- 修改AA.py中@click.command()为@cli.command(),依前面方法依然可以执行,但是如果修改BB.py中@cli.group()为@click.group()、@click.command()或者@cli.command()依旧无法执行
- 中级应用部分
具体代码部分
import click
class Bunch(dict):
def __getattr__(self, key):
if key in self:
return self[key]
raise AttributeError(key)
def __setattr__(self, key, value):
self[key] = value
def _packargs(func):
from functools import wraps
import inspect
@wraps(func)
def wrapped(ctx_or_args, **kargs):
if isinstance(ctx_or_args, Bunch):
args = ctx_or_args
else:
args = ctx_or_args.obj
ignore = inspect.getargspec(func).args
args.update({key: kargs.pop(key) for key in list(kargs)
if key not in ignore and key not in args})
return func(ctx_or_args, **kargs)
return wrapped
def packargs(func):
import click
return click.pass_obj(_packargs(func))
@click.group()
def cli():
pass
@cli.group()
@click.option('--arg1', type=int, default=0,required=True)
@click.option('--arg2', type=int, default=1,required=True)
@packargs
def exp(args):
print "*"*20
print "args1",args
print "*"*20
@exp.command()
@click.option('--fold1', type=int, required=True, help='Fold argument')
@click.option('--fold2', type=click.Choice(['intra-arg1',
'intra-arg2']), required=True)
@packargs
def crossval(args):
print "args:",args
if __name__ == '__main__':
cli(obj=Bunch())
1.其中注意@exp.command处增加了命令行函数crossval和其两个命令行参数 fold1与fold2
2.如果将@exp.command注释掉或者改成@cli.group(),程序报错,根据错误就可以看出group的用法
3.在此测试程序删除或者增加代码,可以测试日常用到的click的基本功能
例子
import click
def seed():
print("seed")
@click.group()
def main():
print("2222")
seed()
pass
@main.command()
def train():
print("3333")
import train
print('Starting Training')
train.main()
@main.command()
def test():
print("4444")
import test
print('Starting Testing')
test.main()
@main.command()
def genUnigram():
print("5555")
if __name__ == "__main__":
print("1111")
main()
python main genunigram