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实现矩阵乘法的方法
Jun 28 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
替换python字典中的key值方法
Jul 06 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
python将一组数分成每3个一组的实例
Nov 14 Python
详解Python 4.0 预计推出的新功能
Jul 26 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
python的time模块和datetime模块实例解析
Nov 29 Python
Python字符串常规操作小结
Apr 03 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
图书管理程序(一)
2006/10/09 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
js数据类型检测总结
2018/08/05 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
python显示天气预报
2014/03/02 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Flask数据库迁移简单介绍
2017/10/24 Python
python实现手机通讯录搜索功能
2018/02/22 Python
django项目搭建与Session使用详解
2018/10/10 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
Django中modelform组件实例用法总结
2020/02/10 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
车间工艺员岗位职责
2013/12/09 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
专家推荐信范文
2015/03/26 职场文书
MySQL分库分表详情
2021/09/25 MySQL
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技