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 合并文件的具体实例
Aug 08 Python
利用Python学习RabbitMQ消息队列
Nov 30 Python
Python爬虫模拟登录带验证码网站
Jan 22 Python
python脚本设置系统时间的两种方法
Feb 21 Python
Python列表切片用法示例
Apr 19 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
PHP内核探索之变量
2015/12/22 PHP
Yii核心验证器api详解
2016/11/23 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
vue使用Google地图的实现示例代码
2018/12/19 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
Python显示进度条的方法
2014/09/20 Python
Python中endswith()函数的基本使用
2015/04/07 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
神路信息Java面试题目
2013/03/31 面试题
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
几个MySql的面试题
2013/04/22 面试题
中秋节超市促销方案
2014/01/30 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
全新239军机修复记
2022/04/05 无线电