Python 对于运维工程师来说,是一门必须掌握的技能。Python 是运维工程师的利器,相比于 Bash,它拥有更加完善的生态和支持,你可以使用 Python 更加简单的完成过去在Bash 当中复杂的功能。
同时,Python 也是众多运维工具的好伙伴,Ansible、SaltStack 等技术,都是基于Python 写就的,掌握了 Python ,你能给节省更多的时间,去做更重要的事情。
本手册内容主要分为以下几部分内容:
不同类型的 Param 类型
str
字符串类型,传入参数会自动转换成字符串。
int
数字类型,传入参数会自动转换成数字。
float
浮点型,传入参数会自动转换为浮点数字。
bool
布尔值,传入参数会自动转换为布尔值。
click.File(mode=‘r’, encoding=None, errors=‘strict’, lazy=None,
atomic=False)
文件类型,传入参数会被自动以文本形式读取内容。
其中,Mode 用于设定读取的模式;
click.Path(exists=False, file_okay=True, dir_okay=True, writable=False,
readable=True, resolve_path=False, allow_dash=False, path_type=None)
路径类型,传入参数会自动以路径形式读取。
其中 exists 要求文件是否必须存在;file_okay 判断是否是文件;dir_okay 判断是否是目录;writable 判断文件是否可写;readable 判断文件是否可读;
click.Choice(choices, case_sensitive=True)
选择类型,可以用于设置选择。输入内容必须是设定的选择。
@click.command()
@click.option('--hash-type',
type=click.Choice(['MD5', 'SHA1'], case_sensitive=False))
def digest(hash_type):
click.echo(hash_type)
click.IntRange(min=None, max=None, min_open=False, max_open=False, clamp=False)
数字范围类型,可以设定允许的数字范围。
@click.command()
@click.option("--count", type=click.IntRange(0, 20, clamp=True))
@click.option("--digit", type=click.IntRange(0, 9))
def repeat(count, digit):
click.echo(str(digit) * count)
click.FloatRange(min=None, max=None, min_open=False,
max_open=False, clamp=False)
浮点数字类型,用法类似 intRange。
click.DateTime(formats=None)
时间类型,传入数据需可被 Format,format 结果由参数定义。
不同类型的 Option
必选 option
@click.command()
@click.option('--n', required=True, type=int)
def dots(n):
click.echo('.' * n)
多参数 option
@click.command()
@click.option('--pos', nargs=2, type=float)
def findme(pos):
a, b = pos
click.echo(f"{a} / {b}")
Flag 型 option
@click.command()
@click.option('--pos', nargs=2, type=float)
def findme(pos):
a, b = pos
click.echo(f"{a} / {b}")
包含提问的 option
@click.command()
@click.option('--name', prompt=True)
def hello(name):
click.echo(f"Hello {name}!")
密码型 option
@click.command()
@click.password_option()
def encrypt(password):
click.echo(f"encoded: to {codecs.encode(password, 'rot13')}")
不同类型的 Argument
普通 Argument
@click.command()
@click.argument('filename')
def touch(filename):
"""Print FILENAME."""
click.echo(filename)
文件 Argument
@click.command()
@click.argument('input', type=click.File('rb'))
@click.argument('output', type=click.File('wb'))
def inout(input, output):
"""Copy contents of INPUT to OUTPUT."""
while True:
chunk = input.read(1024)
if not chunk:
break
output.write(chunk)
文件路径 Argument
@click.command()
@click.argument('filename', type=click.Path(exists=True))
def touch(filename):
"""Print FILENAME if the file exists."""
click.echo(click.format_filename(filename))
特殊用法
命令行输出到标准输出
import click
click.echo('Hello World!')
命令行输出彩色
以下两种方法均可:
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))
或
import click
click.secho('Hello World!', fg='green')
click.secho('Some more text', bg='blue', fg='white')
click.secho('ATTENTION', blink=True, bold=True)
命令行输出分页
@click.command()
def less():
click.echo_via_pager("\n".join(f"Line {idx}" for idx in range(200)))
清空屏幕
import click
click.clear()
命令行进度条
import click
with click.progressbar(all_the_users_to_process) as bar:
for user in bar:
modify_the_user(user)