python命令行工具Click快速掌握


Posted in Python onJuly 04, 2019

前言

写 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 就是两个子命令。 Flask 框架的 flask 命令也是一个 Group 命令。

$ flask
Usage: flask [OPTIONS] COMMAND [ARGS]...

 A general utility script for Flask applications.

 Provides commands from Flask, extensions, and the application. Loads the
 application defined in the FLASK_APP environment variable, or from a
 wsgi.py file. Setting the FLASK_ENV environment variable to 'development'
 will enable debug mode.

  $ export FLASK_APP=hello.py
  $ export FLASK_ENV=development
  $ flask run

Options:
 --version Show the flask version
 --help   Show this message and exit.

Commands:
 add_user      添加账号 :param name: :param username: :param password:...
 init_invite_code  添加邀请码
 recommend_account 更新推荐账号
 routes       Show the routes for the app.
 run        Runs a development server.
 shell       Runs a shell in the app context.

提供了几个预定义的子命令和自定义的命令。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
django模板语法学习之include示例详解
Dec 17 Python
python实现聚类算法原理
Feb 12 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
使用python的pyplot绘制函数实例
Feb 13 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
详解python UDP 编程
Aug 24 Python
python 设置输出图像的像素大小方法
Jul 04 #Python
python变量命名的7条建议
Jul 04 #Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 #Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 #Python
python代理工具mitmproxy使用指南
Jul 04 #Python
Python批量修改图片分辨率的实例代码
Jul 04 #Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 #Python
You might like
php二分法在IP地址查询中的应用
2008/08/12 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
python使用PyGame模块播放声音的方法
2015/05/20 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
python版简单工厂模式
2017/10/16 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
Python多进程编程常用方法解析
2020/03/26 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
英智兴达软件测试笔试题
2016/10/12 面试题
外贸英语专业求职信范文
2013/12/25 职场文书
文明村镇申报材料
2014/05/06 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
防灾减灾活动总结
2014/08/30 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
全陪导游词开场白
2015/05/29 职场文书
环保宣传语大全
2015/07/13 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书