Python 命令行之旅:深入 click 之增强功能

发布时间:2024-12-13  

一、前言

在前面三篇文章中,我们介绍了 click中的参数、选项和命令,本文将介绍 click锦上添花的功能,以帮助我们更加轻松地打造一个更加强大的命令行程序。

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

二、增强功能

2.1 Bash 补全

Bash 补全是 click提供的一个非常便捷和强大的功能,这是它比 argpase和 docopt强大的一个表现。

在命令行程序正确安装后,Bash 补全才可以使用。而如何安装可以参考 setup 集成。Click 目前仅支持 Bash 和 Zsh 的补全。

2.1.1 补全能力

通常来说,Bash 补全支持对子命令、选项、以及选项或参数值得补全。比如:

$ repoclone    commit   copy     delete   setuser
$ repo clone ---deep     --help     --rev      --shallow  -r

此外,click还支持自定义补全,这在动态生成补全场景中很有用,使用 autocompletion参数。autocompletion需要指定为一个回调函数,并且返回字符串的列表。此函数接受三个参数:

  • ctx—— 当前的 click 上下文
  • args传入的参数列表
  • incomplete正在补全的词

这里有一个根据环境变量动态生成补全的示例:

import os def get_env_vars(ctx, args, incomplete): return [k for k in os.environ.keys() if incomplete in k] @click.command() @click.argument("envvar", type=click.STRING, autocompletion=get_env_vars) def cmd1(envvar): click.echo('Environment variable: %s' % envvar)
    click.echo('Value: %s' % os.environ[envvar])

ZSH中,还支持补全帮助信息。只需将 autocompletion回调函数中返回的字符串列表中的字符串改为二元元组,第一个元素是补全内容,第二个元素是帮助信息。

这里有一个颜色补全的示例:

import os def get_colors(ctx, args, incomplete): colors = [('red', 'help string for the color red'),
              ('blue', 'help string for the color blue'),
              ('green', 'help string for the color green')] return [c for c in colors if incomplete in c[0]] @click.command() @click.argument("color", type=click.STRING, autocompletion=get_colors) def cmd1(color): click.echo('Chosen color is %s' % color)

2.1.2 激活补全

要激活 Bash 的补全功能,就需要告诉它你的命令行程序有补全的能力。通常通过一个神奇的环境变量 __COMPLETE来告知,其中 是大写下划线形式的程序名称。

比如有一个命令行程序叫做 foo-bar,那么对应的环境变量名称为 _FOO_BAR_COMPLETE,然后在 .bashrc中使用 source导出即可:

eval "$(_FOO_BAR_COMPLETE=source foo-bar)" 

或者在 .zshrc中使用:

eval "$(_FOO_BAR_COMPLETE=source_zsh foo-bar)" 

不过上面的方式总是在命令行程序启动时调用,这可能在有多个程序时减慢 shell 激活的速度。另一种方式是把命令放在文件中,就像这样:

# 针对 Bash _FOO_BAR_COMPLETE=source foo-bar > foo-bar-complete.sh # 针对 ZSH _FOO_BAR_COMPLETE=source_zsh foo-bar > foo-bar-complete.sh

然后把脚本文件路径加到 .bashrc或 .zshrc中:

. /path/to/foo-bar-complete.sh

2.2 实用工具

2.2.1 打印到标准输出

echo() 函数可以说是最有用的实用工具了。它和 Python 的 print类似,主要的区别在于它同时在 Python 2 和 3 中生效,能够智能地检测未配置正确的输出流,且几乎不会失败(除了 Python 3 中的少数限制。)

echo即支持 unicode,也支持二级制数据,如:

import click

click.echo('Hello World!')

click.echo(b'xe2x98x83', nl=False) # nl=False 表示不输出换行符 

2.2.2 ANSI 颜色

有些时候你可能希望输出是有颜色的,这尤其在输出错误信息时有用,而 click在这方面支持的很好。

首先,你需要安装 colorama:

pip install colorama

然后,就可以使用 style() 函数来指定颜色:

import click

click.echo(click.style('Hello World!', fg='green'))
click.echo(click.style('Some more text', bg='blue', fg='white'))
click.echo(click.style('ATTENTION', blink=True, bold=True))

click还提供了更加简便的函数 secho,它就是 echo和 style的组合:

click.secho('Hello World!', fg='green')
click.secho('Some more text', bg='blue', fg='white')
click.secho('ATTENTION', blink=True, bold=True)

2.2.3 分页支持

有些时候,命令行程序会输出长文本,但你希望能让用户盘也浏览。使用 echo_via_pager() 函数就可以轻松做到。

例如:

def less(): click.echo_via_pager('
'.join('Line %d' % idx for idx in range(200)))

如果输出的文本特别大,处于性能的考虑,希望翻页时生成对应内容,那么就可以使用生成器:

def _generate_output(): for idx in range(50000): yield "Line %d
" % idx @click.command() def less(): click.echo_via_pager(_generate_output())

2.2.4 清除屏幕

使用 clear() 可以轻松清除屏幕内容:

import click
click.clear()

2.2.5 从终端获取字符

通常情况下,使用内建函数 input或 raw_input获得的输入是用户输出一段字符然后回车得到的。但在有些场景下,你可能想在用户输入单个字符时就能获取到并且做一定的处理,这个时候 getchar() 就派上了用场。

比如,根据输入的 y或 n做特定处理:

import click

click.echo('Continue? [yn] ', nl=False)
c = click.getchar()
click.echo() if c == 'y':
    click.echo('We will go on') elif c == 'n':
    click.echo('Abort!') else:
    click.echo('Invalid input :(')

2.2.6 等待按键

在 Windows 的 cmd 中我们经常看到当执行完一个命令后,提示按下任意键退出。通过使用 pause() 可以实现暂停直至用户按下任意键:

import click
click.pause()

2.2.7 启动编辑器

通过 edit() 可以自动启动编辑器。这在需要用户输入多行内容时十分有用。

在下面的示例中,会启动默认的文本编辑器,并在里面输入一段话:

import click def get_commit_message(): MARKER = '# Everything below is ignored
' message = click.edit('

' + MARKER) if message is not None: return message.split(MARKER, 1)[0].rstrip('
')

edit()函数还支持打开特定文件,比如:

import click
click.edit(filename='/etc/passwd')

2.2.8 启动应用程序

通过 launch 可以打开 URL 或文件类型所关联的默认应用程序。如果设置 locate=True,则可以启动文件管理器并自动选中特定文件。

示例:

# 打开浏览器,访问 URL click.launch("https://click.palletsprojects.com/") # 使用默认应用程序打开 txt 文件 click.launch("/my/downloaded/file.txt") # 打开文件管理器,并自动选中 file.txt click.launch("/my/downloaded/file.txt", locate=True)

2.2.9 显示进度条

click内置了 progressbar() 函数来方便地显示进度条。

它的用法也很简单,假定你有一个要处理的可迭代对象,处理完每一项就要输出一下进度,那么就有两种用法。

用法一:使用 progressbar构造出 bar对象,迭代 bar对象来自动告知进度:

import time import click

all_the_users_to_process = ['a', 'b', 'c'] def modify_the_user(user): time.sleep(0.5) with click.progressbar(all_the_users_to_process) as bar: for user in bar:
        modify_the_user(user)

用法二:使用 progressbar构造出 bar对象,迭代原始可迭代对象,并不断向 bar更新进度:

import time import click

all_the_users_to_process = ['a', 'b', 'c'] def modify_the_user(user): time.sleep(0.5) with click.progressbar(all_the_users_to_process) as bar: for user in enumerate(all_the_users_to_process):
        modify_the_user(user)
        bar.update(1)

2.2.10 更多实用工具

  • 打印文件名
  • 标准流
  • 智能打开文件
  • 查找应用程序文件夹

三、总结

click提供了非常多的增强型功能,本文着重介绍了它的 Bash 补全和十多个实用工具,这会让你在实现命令行的过程中如虎添翼。此外,click还提供了诸如命令别名、参数修改、标准化令牌、调用其他命令、回调顺序等诸多高级模式 以应对更加复杂或特定的场景,我们就不再深入介绍。

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

相关文章

    相关demo组件等。 2.1. 配置准备环境 1) 获取校准参数 如果在MYD-LD25X使用LVDS屏幕,初次使用进入weston需要校准屏幕,校准的自动化脚本......
    ,按照所选的受支持的语言执行记录的操作。所以,按照之前的列表,接下来的步骤是: 1. 点击图5中蓝色高亮显示区域右侧的生成图标,打开脚本生成器窗口。 2. 从C#、MATLAB或Python......
    断人当前的行为,比如走路,跑步,上楼,下楼等,很符合Cortex-M系列MCU的应用场景。使用的数据如下图所示。 HAR用到的原始数据 存储库包含以下文件 HAR.py,Python脚本文件,包含基于CNN......
    索相关的评估板。 图6 使用Python语言的ACE代码生成编辑器 使用Python自动处理评估任务 上一节中生成的.py文件可用于轻松启用和重复之前记录的一系列操作。此外,通过编辑这些脚本和自动......
    了GD32的通用库,包括每个系列的HAL以及适配RT-Thread的drivers;tools是生成工程的Python脚本工具;另外就是Boards文件,当然这里的Boards有很多,我这......
    将为这两个部分中的每一个编写代码。对于前面提到的绘图仪,我们将编写一个python脚本,通过UART和Plots接受来自Arduino的数据,而对于转换器,我们将编写一个Arduino草图,该草图从ADC接收......
    包含许多可用于创建新网络的 Python 脚本,许多脚本可以充当模板。 在 BNN github 的 BNN->SRC->Training 目录下,会发现许多可以帮助训练新网络的脚本......
    电脑上的应用程序,将传感器数据和标签记录在ST开发板上 给定的Python脚本将处理数据集并训练NN模型 在STM32CubeMX.AI工具的帮助下,将神经网络训练好的模型导入到STM32项目中 相关......
    -python==4.1.0.25 在树莓派上安装PyAutoGUI PyAutoGUI 是一个跨平台的 GUI 自动Python 模块,可让您的 Python 脚本控制鼠标和键盘以自动......
    学研究正经历革命。 人工智能技术在电磁仿真加速、天线设计优化、电磁兼容性分析、逆向电磁问题求解、自适应滤波器设计及电磁设计自动化等方面 展现出巨大潜力,显著......

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

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

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

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

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

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

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