Python 命令行之旅:深入 click 之参数篇

发布时间:2024-12-13  

一、前言

在上一篇文章中,我们初步掌握了 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.py
hello.txt

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

三、小节

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

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

文章来源于:21IC    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>