一、前言

在概念上, 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.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 和 字节,使得处理文件十分方便。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
@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:breakoutput.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:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
@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,则可读取指定名称的环境变量作为参数值,比如:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
@click.command()
@click.argument('filename', envvar='FILENAME')
def hello(filename):print(filename)

执行如下命令查看效果:

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

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

三、小节

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

Python 命令行之旅:深入 click 之参数篇相关推荐

  1. Python命令行之旅:使用argparse实现git命令

    前言 本文将以我们日常工作中最常见的git命令为例,讲解如何使用argparse库来实现一个真正可用的命令行程序. 本文默认使用 Python 3 作为解释器进行讲解. 若你仍在使用 Python 2 ...

  2. Python 命令行之旅:使用 argparse 实现 git 命令

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  3. Python 命令行之旅:深入 argparse(二)

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  4. Python 命令行解析器argparse及传参数详解

    源码实例一 from argparse import ArgumentParserparser = ArgumentParser(description='Beeswarm')group = pars ...

  5. python argparse_Python 命令行之旅:argparse、docopt、click 和 fire 总结篇

    本文首发于HelloGitHub公众号,并发表于Prodesire 博客. 一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse.docopt.click 和 fire ...

  6. python argparse_Python 命令行之旅:初探 argparse

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...

  7. python argparse_Python 命令行之旅:深入 argparse(二)

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 在上一篇"深入 argparse(一)"的文章中,我们深入了解了 argparse 的包括参 ...

  8. python argparse_Python 命令行之旅——初探 argparse

    『讲解开源项目系列』启动--让对开源项目感兴趣的人不再畏惧.让开源项目的发起者不再孤单.跟着我们的文章,你会发现编程的乐趣.使用和发现参与开源项目如此简单.欢迎联系我们给我们投稿,让更多人爱上开源.贡 ...

  9. python 基础命令-Python 命令行(CLI)基础库

    在 CLI 下写 UI 应用 前阵子看了一下自己去年写的 Python-视频转字符动画,感觉好糗..所以几乎把整篇文章重写了一遍.并使用 curses 库实现字符动画的播放. 但是感觉,curses ...

最新文章

  1. iTween基础之功能简介
  2. boost::hof::implicit用法的测试程序
  3. 华为服务器bmc默认地址_智能数据中心和智慧园区:华为的单点突破与全局效应...
  4. Java基础之代码执行顺序深入解析
  5. 关于多线程的一点补充
  6. Android ui 测试课堂笔记
  7. Linux常用命令、权限管理和开发工具详细介绍
  8. Debian 下配置ssh
  9. TF-tf.keras.layers.MaxPool1D
  10. java batik_java – 如何在Batik SVG库中使用自定义字体?
  11. 魔兽世界怀旧服哪个服务器金价稳定,魔兽世界怀旧服 金价到底会跌到多少的分析...
  12. 单片机 WIFI模块发送AT指令收不到回复问题
  13. Blender中的事件处理器
  14. 笔记本电脑连接无线局域网怎么设置?
  15. 不定积分问题:1/x^3+1的不定积分求法
  16. esp8266+arduino+网页配网+温湿度上传+温度控制开关+eeprom永久保存+微信小程序控制
  17. 董导微博rust视频_丝绸扣碎、阴阳 AJ1 纷纷登场,5 月球鞋发售又有「新惊喜」!...
  18. 指数型基金购买技巧汇总(程序猿买基金必备——未完待续)
  19. iOS开发UI篇—ios应用数据存储方式(偏好设置)
  20. python俩种方法画日本国旗

热门文章

  1. php中如何使用phpredis
  2. Python之禅 by Tim Peters
  3. PHP初级学习之PHP文件
  4. C#基础知识整理:基础知识(1) Main方法
  5. 自由自在公司冰淇淋甜美的健康文化
  6. 【VC基础】 6、VC条件定价
  7. 【备忘录】BADI_ACC_DOCUMENT增强实现
  8. 20、Power Query-数据合并、拆分
  9. java的(PO,VO,TO,BO,DAO,POJO)解释
  10. SAP Basis如何显示SAP中所有用户列表