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 文件与目录操作
Dec 24 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
python 中的int()函数怎么用
Oct 17 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
Python中的With语句的使用及原理
Jul 29 Python
python调用百度API实现人脸识别
Nov 17 Python
Django用内置方法实现简单搜索功能的方法
Dec 18 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 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重新实现PHP脚本引擎内置函数
2007/03/06 PHP
php Smarty模板生成html文档的方法
2010/04/12 PHP
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
PHP基本语法实例总结
2016/09/09 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
JS跨域总结
2012/08/30 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
一百多行python代码实现抢票助手
2018/09/25 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
英语系毕业生自荐信
2013/10/31 职场文书
公司财务自我评价分享
2013/12/17 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
2015元旦节寄语
2014/12/08 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
利用Apache Common将java对象池化的问题
2022/06/16 Servers