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模块学习 filecmp 文件比较
Aug 27 Python
python连接mysql调用存储过程示例
Mar 05 Python
python中类的一些方法分析
Sep 25 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
python实现FTP服务器服务的方法
Apr 11 Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
ipython和python区别详解
Jun 26 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
Python用来做Web开发的优势有哪些
Aug 05 Python
浅谈盘点5种基于Python生成的个性化语音方法
Feb 05 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
使用 MySQL Date/Time 类型
2008/03/26 PHP
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
php json相关函数用法示例
2017/03/28 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
轻松实现python搭建微信公众平台
2016/02/16 Python
python绘制条形图方法代码详解
2017/12/19 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
Python while循环使用else语句代码实例
2020/02/07 Python
Python 创建守护进程的示例
2020/09/29 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
党课学习思想汇报
2014/01/02 职场文书
元旦晚会邀请函
2014/01/27 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
人资专员岗位职责
2014/04/04 职场文书
教师对学生的评语
2014/04/28 职场文书
企业趣味活动方案
2014/08/21 职场文书
房产公证书格式
2015/01/26 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书