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检测手机QQ在线状态的脚本代码
Feb 10 Python
Python的dict字典结构操作方法学习笔记
May 07 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
Python 专题一 函数的基础知识
Mar 16 Python
Python实现KNN邻近算法
Jan 28 Python
Python iter()函数用法实例分析
Mar 17 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 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
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
php中filter_input函数用法分析
2014/11/15 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
JQuery从头学起第一讲
2010/07/04 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
node前端模板引擎Jade之标签的基本写法
2018/05/11 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
python实现堆栈与队列的方法
2015/01/15 Python
python将txt文件读取为字典的示例
2018/12/22 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
校本教研工作制度
2014/01/22 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
世界名著读书笔记
2015/06/25 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript
vue实现Toast组件轻提示
2022/04/10 Vue.js