美文网首页
命令行神器 Click 快速上手

命令行神器 Click 快速上手

作者: _Cappuccino_ | 来源:发表于2020-02-04 09:01 被阅读0次

    写 Python 的经常要写一些命令行工具,虽然标准库提供有命令行解析工具 Argparse,但是写起来非常麻烦,我很少会使用它。命令行工具中用起来最爽的就是 Click,它是 Flask 的团队 pallets 的开源项目。Click 只要很少的代码就可以优雅地创造一个命令行工具,它致力于将创建命令行工具的过程变的快速而有趣。

    安装

    pip install click

    使用

    创建 click_demo.py ,写一个最简单的函数

    import click
    
    @click.command()
    def hello():
       click.echo('Hello World!')
    
    if __name__ == '__main__':
       hello()
    

    运行:

    python click_demo.py
    Hello World!
    

    装饰器 click.command() 使函数秒变命令行工具,echo 函数的作用等同于 print 函数。

    参数

    装饰器 click.option()可以给命令行函数指定参数

    import click
    
    @click.command()
    @click.option("--count", default=1, help="打印次数", type=int)
    def hello(count):
        """
        这是一个简单示例
        """
        for i in range(count):
            click.echo('Hello World!')
    
    if __name__ == '__main__':
        hello()
    --count:count是参数的名字
    default : 参数的默认值
    type:给参数指定类型
    help: 说明文档
    

    执行脚本的时候后面加上参数 --help 就可以查看说明文档。

    $ python click_demo.py --help
    
    Usage: click_demo.py [OPTIONS]
    
      这是一个简单示例
    
    Options:
      --count INTEGER  打印次数
      --help        Show this message and exit.
    

    指定参数:

    python click_demo.py --count 3
    
    Hello World!
    Hello World!
    Hello World!
    

    prompt

    有些命令行工具在运行的时候要求用户输入信息,可以给 option 装饰器指定 prompt 参数

    import click
    
    @click.command()
    @click.option("--count", default=1, help="打印次数", type=int)
    @click.option("--name", prompt="请输入名字", help="姓名")
    def hello(count, name):
        """
        这是一个简单示例
        """
        for i in range(count):
            click.echo(f'Hello {name}!')
    
    if __name__ == '__main__':
        hello()
    $ python click_demo.py
    
    请输入名字: lzjun
    Hello lzjun!
    

    Group

    Click 很重要的一个特性就是它的分组功能,当一个命令行工具的逻辑已经非常复杂的时候,为了解耦,我们需要将不同的逻辑放在不同的命令中,这样既可以避免单个命令行工具函数臃肿。
    来看个例子:

    # db.py
    import click
    
    @click.group()
    def db():
        pass
    
    @click.command()
    @click.option("--name", help="用户名")
    def add(name):
        """
        添加用户
        :param name:
        :return:
        """
        click.echo(f'add user {name}')
    
    @click.command()
    @click.option("--id", help="用户名")
    def delete(id):
        """
        删除用户
        :param id:
        :return:
        """
        click.echo(f'delete user {id}')
    
    db.add_command(delete)
    db.add_command(add)
    
    if __name__ == '__main__':
        db()
    

    这是一个操作数据库DB的命令行工具,提供了添加用户和删除用户的命令行等其它操作,如果所有的业务逻辑全部写在一个函数,维护变得异常困难。

    @click.group 装饰器把函数装饰成为一个Group对象,通过 Group 可以添加很多子命令。

    python db.py  --help
    Usage: db.py [OPTIONS] COMMAND [ARGS]...
    
    Options:
      --help  Show this message and exit.
    
    Commands:
      add     添加用户 :param name: :return:
      delete  删除用户 :param id: :return:
    

    从帮助文档中我们看到 add 和 delete 就是两个子命令。

    相关文章

      网友评论

          本文标题:命令行神器 Click 快速上手

          本文链接:https://www.haomeiwen.com/subject/wlzhxhtx.html