python click实现命令行接口


click文档

安装命令:

pip install click

一些常见的用法如下

详细运行可通过命令查看:python jiaoben.py --help

import sys
import click
from typing import IO


@click.group()
@click.version_option('1.0.0', prog_name="测试")
def main():
    pass


@main.command(help="这是一个测试程序")
@click.option("-A", "--all", default=True, is_flag=True, type=click.Choice(False, True), show_default=True, show_choices=True, help="select all")
@click.option("-B", "--batch", default=True, type=click.Choice(False, True), show_default=True, show_choices=True, help="select all")
def print_test():
    """
    is_flag: 是否可以缺省
    prompt: 当在命令行中没有输入相应的参数时,会根据 prompt 提示用户输入
    type: string, int, float ,click.Choice
    """
    click.echo()


@main.command("n", help="使用命令python cli.py n src dst 来运行")
@click.argument('src', nargs=-1)
@click.argument('dst', nargs=1)
def net_print(src, dst):
    """
    python cli.py  src1 src2 src3 dst
    输入:  ('src1', 'src2', 'src3')---dst

    pip install colorama
    click.secho 可输出带颜色的字体和背景

    :param src: nargs: -1 表明参数 src 接收不定量的参数值,参数值会以 tuple 的形式传入函数
    :param dst: nargs:1 大于等于 1,表示接收 nargs 个参数值
    :return:
    """
    click.echo(f'{src}---{dst}')
    click.secho(f'{src}---{dst}', fg='yellow', bg='red', underline=True, dim=True, bold=True)


@main.command(help="复制文件")
@click.argument('input_file', default=(None if sys.stdout.isatty() else "-"),type=click.File("rb"))
@click.argument('output_file', default=(None if sys.stdout.isatty() else "-"),type=click.File("wb", lazy=True))
def copy_file(input_file: IO, output_file: IO):
    while True:
        chunk = input_file.read(1024)
        if not chunk:
            break
        output_file.write(chunk)


@main.command(help="命令使用get-file-path,输入参数时,路径读取并判断是否存在")
@click.argument("filename", type=click.Path(exists=True))
def get_file_path(filename):
    # 清除终端屏幕
    click.clear()
    click.echo(click.format_filename(filename))
    click.echo(click.style(click.format_filename(filename), bg="blue", fg="red"))

@main.command()
@click.argument("app_or_url_file")
def launch(app_or_url_file):
    """
    打开指定的 URL, app, 文件
    :param app_or_url_file:  URL / app(必须用双引号) / 文件
    :return:
    """
    click.launch(app_or_url_file)

if __name__ == '__main__':
    main()