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编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
python xml解析实例详解
Nov 14 Python
python去除空格和换行符的实现方法(推荐)
Jan 04 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
对Python实现简单的API接口实例讲解
Dec 10 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
Flask配置Cors跨域的实现
Jul 12 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
Java ExcutorService优雅关闭方式解析
May 30 Python
解决pytorch 数据类型报错的问题
Mar 03 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python批量下载图片的三种方法
2013/04/22 Python
跟老齐学Python之网站的结构
2014/10/24 Python
Python中threading模块join函数用法实例分析
2015/06/04 Python
Python实现基本线性数据结构
2016/08/22 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
学python最电脑配置有要求么
2020/07/05 Python
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
简单说下OSPF的操作过程
2014/08/13 面试题
初中政治教学反思
2014/01/17 职场文书
餐厅筹备计划书
2014/04/25 职场文书
孟佩杰观后感
2015/06/17 职场文书
二年级作文之动物作文
2019/11/13 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python