一:Click导航
- 地址: https://click.palletsprojects.com/en/8.0.x/
- 安装click: pip install Click
- 参看文献:https://isudox.com/2016/09/03/learning-python-package-click/
二:Click的基本使用
1: 官网案例演示:
-
官网案例代码:
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
help='The person to greet.')
def hello(count, name):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()
-
将代码复制到hello.py文件中,执行: python hello.py --count=3 (flask_env) C:\Users\renshanwen\Desktop>python hello.py --count=3
Your name: liangshan
Hello liangshan!
Hello liangshan!
Hello liangshan!
-
执行 python hello.py --help (flask_env) C:\Users\renshanwen\Desktop>python hello.py --help
Usage: hello.py [OPTIONS]
Simple program that greets NAME for a total of COUNT times.
Options:
--count INTEGER Number of greetings.
--name TEXT The person to greet.
--help Show this message and exit.
2: @click.command装饰器
3: @click.group()装饰器:
-
不同的 Command 实例可以关联到 group 中。group 下绑定的命令就成为了它的子命令。 -
@click.group 装饰器把方法装饰为可以拥有多个子命令的 Group 对象。由 Group.add_command() 方法把 Command 对象关联到 Group 对象。 @click.group()
def cli():
pass
@click.command()
def initdb():
click.echo('Initialized the database')
@click.command()
def dropdb():
click.echo('Dropped the database')
cli.add_command(initdb)
cli.add_command(dropdb)
-
也可以直接用 @Group.command 装饰方法,会自动把方法关联到该 Group 对象下。 @click.group()
def cli():
pass
@cli.command()
def initdb():
click.echo('Initialized the database')
@cli.command()
def dropdb():
click.echo('Dropped the database')
4: 命令行参数
-
Click 支持对 command 方法添加自定义的参数,由 option() 和 argument() 装饰器实现。 -
案例: @click.command()
@click.option('--count', default=1, help='number of greetings')
@click.argument('name')
def hello(count, name):
for x in range(count):
click.echo('Hello %s!' % name)
4.1: Option参数:
-
‘–参数名’,表示输入的参数。 -
default = 默认值 -
nargs = 数量,表示参数的数量。 -
type = 类型,限制参数的类型。 -
multiple=True, 允许一个参数多次使用。 -
prompt=True, 命令输错友好提示。 -
案例: @click.command()
@click.option('--pos', nargs=2, type=float)
def findme(pos):
click.echo('%s / %s' % pos)
-
在命令行后面跟随 --pos=2,就会输出两遍,默认是执行一遍的。 -
type也可以指定不同的类型: @click.command()
@click.option('--item', type=(unicode, int))
def putitem(item):
click.echo('name=%s id=%d' % item)
-
一个参数传入多次:
- option 通过
multiple 标识位来支持这一特性。 import click
@click.command()
@click.option('--message', '-m', multiple=True)
def commit(message):
click.echo('\n'.join(message))
if __name__ == '__main__':
commit()
(flask_env) C:\Users\renshanwen\Desktop>python commit.py -m liangshan -m dada
liangshan
dada
-
限定传参的类型范围:
- 当上面的命令行程序参数
--hash-type 不是 md5 或 sha1,就会输出错误提示,并且在 --help 提示中也会对 choice 选项有显示。 import click
@click.command()
@click.option('--hash_type', type=click.Choice(['md5', 'sha1']))
def digest(hash_type):
click.echo(hash_type)
if __name__ == '__main__':
digest()
(flask_env) C:\Users\renshanwen\Desktop>python commit.py --hash_type md5
md5
(flask_env) C:\Users\renshanwen\Desktop>python commit.py --hash_type xxx
Usage: commit.py [OPTIONS]
Try 'commit.py --help' for help.
Error: Invalid value for '--hash_type': 'xxx' is not one of 'md5', 'sha1'.
-
友好提示演示:
@click.command()
@click.option('--name', prompt=True)
def hello(name):
click.echo('Hello %s!' % name)
(flask_env) C:\Users\renshanwen\Desktop>python commit.py --name liangshan
Hello liangshan!
(flask_env) C:\Users\renshanwen\Desktop>python commit.py
Name:
Name:
Name: liangshan
Hello liangshan!
import click
@click.command()
@click.option('--name', prompt="请输入名字")
def hello(name):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()
(flask_env) C:\Users\renshanwen\Desktop>python commit.py
请输入名字:
请输入名字: liangshan
Hello liangshan!
-
密码等进行输入隐藏: import click
@click.command()
@click.option('--password', prompt=True, hide_input=True,
confirmation_prompt=True)
def encrypt(password):
click.echo('Encrypting password to %s' % password)
if __name__ == '__main__':
encrypt()
(flask_env) C:\Users\renshanwen\Desktop>python commit.py
Password:
Repeat for confirmation:
Encrypting password to 123456
@click.command()
@click.password_option()
def encrypt(password):
click.echo('Encrypting password to %s' % password.encode('rot13'))
4.2: Argument参数:
-
1: 使用argument进行传参: import click
@click.command()
@click.argument('filename')
def touch(filename):
click.echo(filename)
if __name__ == '__main__':
touch()
(flask_env) C:\Users\renshanwen\Desktop>python commit.py liangshan
liangshan
-
2: 使用argument进行传参(可变参数)
-
nargs=-1 -
分析: 我们发现src是可变参数,dst限制参数一个。 import click
@click.command()
@click.argument('src', nargs=-1)
@click.argument('dst', nargs=1)
def copy(src, dst):
for fn in src:
click.echo('move %s to folder %s' % (fn, dst))
if __name__ == '__main__':
copy()
(flask_env) C:\Users\renshanwen\Desktop>python commit.py aaa bbb ccc AAA
move aaa to folder AAA
move bbb to folder AAA
move ccc to folder AAA
-
3: 对文件进行操作:
- 注意: 使用- 作为标准输入和输出。
- 如果只是想修改文件名:type=click.Path(exists=True)
@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)
if not chunk:
break
output.write(chunk)
$ inout - hello.txt
hello
^D
$ inout hello.txt -
hello
@click.command()
@click.argument('f', type=click.Path(exists=True))
def touch(f):
click.echo(click.format_filename(f))
5: 打包成跨平台可执行程序
|