Python命令行click参数用法解析


Posted in Python onDecember 19, 2019

这篇文章主要介绍了Python命令行click参数用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、前言

在概念上, click 把命令行分为 3 个组成:参数、选项和命令。

参数 就是跟在命令后的除选项外的内容,比如 git add a.txt 中的 a.txt 就是表示文件路径的参数

选项 就是以 - 或 -- 开头的参数,比如 -f、--file

命令 就是命令行的初衷了,比如 git 就是命令,而 git add 中的 add 则是 git 的子命令

二、参数

2.1 基本参数

基本参数 就是通过位置里指定参数值。

比如,我们可以指定两个位置参数 x 和 y ,先添加的 x 位于第一个位置,后加入的 y 位于第二个位置。那么在命令行中输入 1 2的时候,分别对应到的就是 x 和 y:

@click.command()
@click.argument('x')
@click.argument('y')
def hello(x, y):
  print(x, y)

2.2 参数类型

参数类型 就是将参数值作为什么类型去解析,默认情况下是字符串类型。我们可以通过 type 入参来指定参数类型。

click 支持的参数类型多种多样:

  • str / click.STRING 表示字符串类型,这也是默认类型
  • int / click.INT 表示整型
  • float / click.FLOAT 表示浮点型
  • bool / click.BOOL 表示布尔型。很棒之处在于,它会识别表示真/假的字符。对于 1、yes、y 和 true 会转化为 True;0、no、n 和 false 会转化为 False
  • click.UUID 表示 UUID,会自动将参数转换为 uuid.UUID 对象
  • click.FILE 表示文件,会自动将参数转换为文件对象,并在命令行结束时自动关闭文件
  • click.PATH 表示路径
  • click.Choice 表示选择选项
  • click.IntRange 表示范围选项

同 argparse 一样,click 也支持自定义类型,需要编写 click.ParamType 的子类,并重载 convert 方法。

2.3 文件参数

在基本参数的基础上,通过指定参数类型,我们就能构建出各类参数。

文件参数 是非常常用的一类参数,通过 type=click.File 指定,它能正确处理所有 Python 版本的 unicode 和 字节,使得处理文件十分方便。

@click.command()
@click.argument('input', type=click.File('rb')) # 指定文件为二进制读
@click.argument('output', type=click.File('wb')) # 指定文件为二进制写
def inout(input, output):
  while True:
    chunk = input.read(1024) # 此时 input 为文件对象,每次读入 1024 字节
    if not chunk:
      break
    output.write(chunk) # 此时 output 为文件对象,写入上步读入的内容

2.4 文件路径参数

文件路径参数 用来处理文件路径,可以对路径做是否存在等检查,通过 type=click.Path 指定。不论文件名是 unicode 还是字节类型,获取到的参数类型都是 unicode 类型。

@click.command()
@click.argument('filename', type=click.Path(exists=True)) # 要求给定路径存在,否则报错
def hello(filename):
  click.echo(click.format_filename(filename))

如果文件名是以 - 开头,会被误认为是命令行选项,这个时候需要在参数前加上 -- 和空格,比如

$ python hello.py -- -foo.txt
-foo.txt

2.5 选择项参数

选择项参数 用来限定参数内容,通过 type=click.Choice 指定。

比如,指定文件读取方式限制为 read-only 和 read-write:

@click.command()
@click.argument('mode', type=click.Choice(['read-only', 'read-write']))
def hello(mode):
  click.echo(mode)

2.6 可变参数

可变参数 用来定义一个参数可以有多个值,且能通过 nargs 来定义值的个数,取得的参数的变量类型为元组。

若 nargs=N,N为一个数字,则要求该参数提供 N 个值。若 N 为 -1 则接受提供无数量限制的参数,如:

@click.command()
@click.argument('foo', nargs=-1)
@click.argument('bar', nargs=1)
def hello(foo, bar):
  pass

如果要实现 argparse 中要求参数数量为 1 个或多个的功能,则指定 nargs=-1 且 required=True 即可:

@click.command()
@click.argument('foo', nargs=-1, required=True)
def hello(foo, bar):
  pass

2.7 从环境变量读取参数

通过在 click.argument 中指定 envvar,则可读取指定名称的环境变量作为参数值,比如:

@click.command()
@click.argument('filename', envvar='FILENAME')
def hello(filename):
  print(filename)

执行如下命令查看效果:

$ FILENAME=hello.txt python3 hello.py
hello.txt

而在 argparse 中,则需要自己从环境变量中读取。

三、小节

本文讲解了 click 中基本参数的用法,在此基础上介绍了各种类型的参数,最后说明了从环境变量中获取参数值的写法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
python实现外卖信息管理系统
Jan 11 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
解决Python requests库编码 socks5代理的问题
May 07 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 Python
python读取pdf格式文档的实现代码
Apr 01 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 #Python
Python定义函数时参数有默认值问题解决
Dec 19 #Python
Python爬取腾讯视频评论的思路详解
Dec 19 #Python
使用Pandas将inf, nan转化成特定的值
Dec 19 #Python
pandas中read_csv的缺失值处理方式
Dec 19 #Python
python错误调试及单元文档测试过程解析
Dec 19 #Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 #Python
You might like
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
PHP对字符串的递增运算分析
2010/08/08 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
JQuery选择器特辑 详细小结
2012/05/14 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
python正则表达式match和search用法实例
2015/03/26 Python
Python中decorator使用实例
2015/04/14 Python
python关键字and和or用法实例
2015/05/28 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
python plotly画柱状图代码实例
2019/12/13 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
Python输出指定字符串的方法
2020/02/06 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
个人简历自我评价八例
2013/10/31 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
七一讲话心得体会
2014/09/05 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
导游词之湖州-太湖
2019/10/11 职场文书
JavaScript的function函数详细介绍
2021/11/20 Javascript