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翻译软件实现代码(使用google api完成)
Nov 26 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
python scp 批量同步文件的实现方法
Jan 03 Python
利用python numpy+matplotlib绘制股票k线图的方法
Jun 26 Python
python实现爬取百度图片的方法示例
Jul 06 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
关于tf.reverse_sequence()简述
Jan 20 Python
Python Json数据文件操作原理解析
May 09 Python
Python流程控制语句的深入讲解
Jun 15 Python
如何使用python写截屏小工具
Sep 29 Python
利用python进行数据加载
Jun 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
php实现ping
2006/10/09 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
python单元测试unittest实例详解
2015/05/11 Python
python如何获取服务器硬件信息
2017/05/11 Python
Python探索之创建二叉树
2017/10/25 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
业务代表的岗位职责
2013/11/16 职场文书
经典优秀个人求职信分享
2013/12/12 职场文书
优秀公益广告词大全
2014/03/19 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
2014年党课学习材料
2014/05/11 职场文书
竞聘上岗演讲
2014/05/19 职场文书
中学教师师德承诺书
2014/05/23 职场文书
先进单位事迹材料
2014/12/25 职场文书
经营场所使用证明
2015/06/19 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python