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 selenium 三种等待方式详解(必会)
Sep 15 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
Python计时相关操作详解【time,datetime】
May 26 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
浅析Python四种数据类型
Sep 26 Python
python pands实现execl转csv 并修改csv指定列的方法
Dec 12 Python
对python调用RPC接口的实例详解
Jan 03 Python
python使用递归的方式建立二叉树
Jul 03 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
python中count函数简单用法
Jan 05 Python
Pytorch环境搭建与基本语法
Jun 03 Python
Python制作动态字符画的源码
Aug 04 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文件下载类
2006/12/06 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
php使用qr生成二维码的示例分享
2014/01/20 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
利用php输出不同的心形图案
2016/04/22 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
init进程的作用
2015/08/20 面试题
职业生涯规划书基本格式
2014/01/06 职场文书
学生会干部自荐信
2014/02/04 职场文书
初中班主任评语大全
2014/04/24 职场文书
企业挂职心得体会
2014/09/10 职场文书
合作协议书模板
2014/10/10 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
处罚决定书范文
2015/06/24 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
实例详解Python的进程,线程和协程
2022/03/13 Python
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android