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开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 Python
Python读写Excel文件方法介绍
Nov 22 Python
Python聚类算法之凝聚层次聚类实例分析
Nov 20 Python
Python错误: SyntaxError: Non-ASCII character解决办法
Jun 08 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
python清除字符串中间空格的实例讲解
May 11 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
python中删除某个元素的方法解析
Nov 05 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
pycharm使用技巧之自动调整代码格式总结
Nov 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
Windows下PHP的任意文件执行漏洞
2006/10/09 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
给ECShop添加最新评论
2015/01/07 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
python 爬取微信文章
2016/01/30 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
Python中的TCP socket写法示例
2018/05/11 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
Java语言程序设计测试题改错题部分
2014/07/22 面试题
行政助理的职责
2013/11/14 职场文书
财务会计应届生求职信
2013/11/24 职场文书
无工作经验者个人求职信范文
2013/12/22 职场文书
简历的个人自我评价范文
2014/01/03 职场文书
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript
python 离散点图画法的实现
2022/04/01 Python