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在校内发人人网状态(人人网看状态)
Feb 19 Python
python计算牛顿迭代多项式实例分析
May 07 Python
关于Django外键赋值问题详解
Aug 13 Python
Python工厂函数用法实例分析
May 14 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
python tkinter canvas使用实例
Nov 04 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
python自动化办公操作PPT的实现
Feb 05 Python
Django 如何实现文件上传下载
Apr 08 Python
python异常中else的实例用法
Jun 15 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
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
php实现微信扫码支付
2017/03/26 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
angularJS深拷贝详解
2017/03/23 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
python  logging日志打印过程解析
2019/10/22 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
苹果音乐订阅:Apple Music
2018/08/02 全球购物
行政管理毕业生自荐信
2014/02/24 职场文书
幼儿园户外活动总结
2014/07/04 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
python开发的自动化运维工具ansible详解
2021/08/07 Python