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

Python 号令行之旅:深切 click 之加强功能 时候:2024-12-13 21:12:38 手机看文章

扫描二维码随时随地手机看文章

1、媒介

在前面三篇文章中,我们介绍了 click中的参数、选项和号令,本文将介绍 click锦上添花的功能,以帮忙我们加倍轻松地打造一个加倍壮大的号令行法式。

本系列文章默许利用 Python 3 作为注释器进行讲授。若你仍在利用 Python 2,请留意二者之间语法和库的利用差别哦~
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 clickclick.echo('Hello World!')click.echo(b'\xe2\x98\x83', nl=False) # nl=False 暗示不输出换行符 
2.2.2 ANSI 色彩

有些时辰你可能但愿输出是有色彩的,这特别在输犯错误信息时有效,而 click在这方面撑持的很好。

起首,你需要安装 colorama:

pip install colorama

然后,便可以利用 style() 函数来指定色彩:

import clickclick.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('\n'.join('Line %d' % idx for idx in range(200)))

假如输出的文本特殊年夜,处在机能的斟酌,但愿翻页时生成对应内容,那末便可以利用生成器:

def _generate_output(): for idx in range(50000): yield "Line %d\n" % idx @click.command() def less(): click.echo_via_pager(_generate_output())
2.2.4 断根屏幕

利用 clear() 可以轻松断根屏幕内容:

import clickclick.clear()
2.2.5 从终端获得字符

凡是环境下,利用内建函数 input或 raw_input取得的输入是用户输出一段字符然后回车获得的。但在有些场景下,你可能想在用户输入单个字符时就可以获得到而且做必然的处置,这个时辰 getchar() 就派上了用处。

好比,按照输入的 y或 n做特定处置:

import clickclick.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 clickclick.pause()
2.2.7 启动编纂器

经由过程 edit() 可以主动启动编纂器。这在需要用户输入多行内容时十分有效。

鄙人面的示例中,会启动默许的文本编纂器,并在里面输入一段话:

import click def get_commit_message(): MARKER = '# Everything below is ignored\n' message = click.edit('\n\n' + MARKER) if message is not None: return message.split(MARKER, 1)[0].rstrip('\n')

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

import clickclick.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 clickall_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 clickall_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 更多适用东西 打印文件名 尺度流 智能打开文件 查找利用法式文件夹 3、总结

click供给了很是多的加强型功能,本文侧重介绍了它的 Bash 补全和十多个适用东西,这会让你在实现号令行的进程中如虎添翼。另外,click还供给了诸如号令别号、参数点窜、尺度化令牌、挪用其他号令、回调挨次等诸多高级模式 以应对加倍复杂或特定的场景,我们就不再深切介绍。

欲知详情,请下载word文档 下载文档

上一篇:开云-Google 开源的 Python 命令行库:深入 fire(一) 下一篇:开云-快速搭建 SpringCloud 微服务开发环境的脚手架