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登录pop3邮件服务器接收邮件的方法
Apr 30 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
python中安装模块包版本冲突问题的解决
May 02 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
python将字典内容存入mysql实例代码
Jan 18 Python
Python KMeans聚类问题分析
Feb 23 Python
python 字典中取值的两种方法小结
Aug 02 Python
python把转列表为集合的方法
Jun 28 Python
django中间键重定向实例方法
Nov 10 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
python中的random模块和相关函数详解
Apr 22 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
在线增减.htpasswd内的用户
2006/10/09 PHP
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
Python callable()函数用法实例分析
2018/03/17 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
军训拉歌口号
2014/06/13 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
户外拓展训练感想
2015/08/07 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
vue+iview实现手机号分段输入框
2022/03/25 Vue.js
Minikube搭建Kubernetes集群
2022/03/31 Servers
MySQL数据库简介与基本操作
2022/05/30 MySQL