Python 命令行之旅:深入 click 之参数篇(python的click)

Python 命令行之旅:深入 click 之参数篇(python的click)

作者:HelloGitHub-Prodesire

涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库[1]

一、前言

在上一篇文章中,我们初步掌握了 click 的简单用法,并了解到它与 argparse 和 docopt 的不同。接下来,将深入介绍 click 的各类用法,以让你能轻松打造复杂的命令行程序。

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

  • 参数 就是跟在命令后的除选项外的内容,比如 git add a.txt 中的 a.txt 就是表示文件路径的参数
  • 选项 就是以 – 或 — 开头的参数,比如 -f、–file
  • 命令 就是命令行的初衷了,比如 git 就是命令,而 git add 中的 add 则是 git 的子命令

本系列文章默认使用 Python 3 作为解释器进行讲解。若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~

二、参数

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 方法。

官网提供了一个例子,实现了一个整数类型,除了普通整数之外,还接受十六进制和八进制数字, 并将它们转换为常规整数:

class BasedIntParamType(click.ParamType): name = \”integer\” def convert(self, value, param, ctx): try: if value[:2].lower() == \”0x\”: return int(value[2:], 16) elif value[:1] == \”0\”: return int(value, 8) return int(value, 10) except TypeError: self.fail( \”expected string for int() conversion, got \” f\”{value!r} of type {type(value).__name__}\”, param, ctx, ) except ValueError: self.fail(f\”{value!r} is not a valid integer\”, param, ctx)BASED_INT = BasedIntParamType()

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.pyhello.txt

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

三、小节

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

在下一篇文章中,我们来继续深入了解 click 的功能,看看它都支持什么样的“选项”。

参考资料

[1]HelloGitHub-Team 仓库: https://github.com/HelloGitHub-Team/Article


『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2024年7月8日 上午10:28
下一篇 2024年7月8日 上午10:40

相关推荐

  • 研发项目经费管理办法

    研发项目经费管理办法 随着科技的不断发展,企业的研发工作也变得越来越重要。为了规范企业的研发项目经费管理,我们制定了一份研发项目经费管理办法。该办法旨在确保企业的研发工作能够有序进…

    科研百科 2024年9月12日
    28
  • 科技创新项目成果引号书名号

    科技创新项目成果引号书名号科技创新项目成果引号书名号书名是:科技创新,科技创新,科技创新,科技创新,科技创新。科技创新,科技创新,科技创新,科技创新就是,科技创新就是科技创新。科技…

    科研百科 2024年11月26日
    0
  • 预算编制不细化案例

    预算编制不细化案例 在组织预算时,细化预算编制是非常重要的。预算编制的细化可以更好地了解资源的使用情况,并采取措施来减少浪费。然而,在某些情况下,预算编制并不细化,这可能会导致一些…

    科研百科 2024年10月27日
    0
  • 党组织工作经费按月计提吗

    党组织工作经费按月计提吗? 党组织工作经费是党组织的一项重要资金来源,用于支持党组织的工作和事业的发展。然而,对于如何提取和使用党组织工作经费,不同的国家和地区有着不同的规定。在这…

    科研百科 2024年10月17日
    5
  • 四创电子申请工程项目管理系统专利,实现项目进度、人员、质量、安全等精细管控

    金融界2024年3月22日消息,据国家知识产权局公告,四创电子股份有限公司申请一项名为“一种基于全过程数字化的工程项目管理系统“,公开号CN117745205A,申请日期为2023…

    科研百科 2024年4月25日
    93
  • 锂电新势力——楚能新能源正式进入电动船舶领域(楚能新能源怎么样)

    在船舶动力领域,电动船舶凭借其绿色环保、安全性高和成本低等优点,逐渐成为了主要形式。根据GGII数据显示,中国船舶锂电化渗透率从2019年的0.04%上涨到了2022年0.55%,…

    科研百科 2023年3月27日
    366
  • 签署“军令状”!四川首批住建领域“揭榜挂帅”科技项目进入科研攻关阶段

    来源:【四川日报-川观新闻】 川观新闻记者 田姣 文/图 为进一步推动全省住房城乡建设领域科技创新工作,10月27日,四川省住房和城乡建设厅召开2023年住房城乡建设领域“揭榜挂帅…

    科研百科 2023年11月20日
    95
  • “两所一庭一中心”矛调化解工作方案

    “两所一庭一中心”矛调化解工作方案“两所一庭一中心”矛调化解工作方案第一个“中心”是指工业生产。工业生产是中国的一部分,这是中国古代商品经济发展的趋势。它是商品经济发展的加速。这与…

    科研百科 2024年11月20日
    0
  • 档案管理系统 购买

    档案管理系统是一个非常重要的工具,能够帮助人们管理大量的文件和资料。随着数字化时代的到来,档案管理系统已经成为了一个非常流行的工具。如果您正在考虑购买档案管理系统,以下是一些您需要…

    科研百科 2024年8月19日
    35
  • 博士生带本科生科研

    博士生带本科生科研 摘要 在高等教育中,博士生带本科生科研已经成为一个热门话题。博士生能够为本科生提供科研指导,帮助他们更好地理解科研方法和技巧,同时也能够提高本科生的科研能力。本…

    科研百科 2024年10月17日
    0