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 相关文章推荐
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
Python用threading实现多线程详解
Feb 03 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
Flask框架路由和视图用法实例分析
Nov 07 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
基于Python3.7.1无法导入Numpy的解决方式
Mar 09 Python
python和C++共享内存传输图像的示例
Oct 27 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 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入门教程 精简版
2009/12/13 PHP
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
javascript中clone对象详解
2014/12/03 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
使用python turtle画高达
2020/01/19 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
创建无烟单位实施方案
2014/03/29 职场文书
校庆团日活动总结
2014/08/28 职场文书
男方婚前保证书
2015/02/28 职场文书
安全教育主题班会教案
2015/08/12 职场文书
趣味运动会广播稿
2015/08/19 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android