[英]Creating command line application in python using Click
我正在使用Click库创建一个命令行应用程序,该库接受名称作为输入,但如果没有输入名称,则返回默认值。
这是我到目前为止的代码。
hello.py
import click
@click.version_option(1.0)
@click.command()
@click.argument('string', default='World')
@click.option('-r', '--repeat', default=1, help='How many times should be greeted.')
def cli(string,repeat):
'''This string greets you.'''
for i in xrange(repeat):
click.echo('Hello %s!' % string)
if __name__ == '__main__':
cli()
当我运行它。
$你好
Hello World!
$ hello Bob
Hello Bob!
$ hello Bob -r 3
Hello Bob!
Hello Bob!
Hello Bob!
这正是我想要的。
现在,我希望能够接受来自stdin的输入,如下面的示例所示。
$ echo John | 你好
Hello John!
$ echo John | 你好-r 3
Hello John!
Hello John!
Hello John!
问题是管道之前的命令结果将在应用程序内部消耗,而不是作为它的参数。 由于您的应用程序本身不使用任何输入,因此管道中的所有内容都将被丢弃。
如果您希望应用程序是“可管理的”,只需在其中插入raw_input
,因为此函数从stdin读取。
要使程序看起来像猫,你可以这样做:
@click.command()
@click.argument('string', required=False)
@click.option('-r', '--repeat', default=1, help='How many times should be greeted.')
def cli(string, repeat):
'''This string greets you.'''
if not string:
string = raw_input()
for i in xrange(repeat):
click.echo('Hello %s!' % string)
另一种选择是在选项中转换字符串并将提示符设置为True:
@click.command()
@click.option('--string', prompt=True)
@click.option('-r', '--repeat', default=1, help='How many times should be greeted.')
def cli(string, repeat):
'''This string greets you.'''
for i in xrange(repeat):
click.echo('Hello %s!' % string)
这样,如果用户没有提供字符串,系统将提示他输入,这也使您的应用程序也可以管道化。 唯一的问题是,它会打印到标准输出STRING:
有时是不能接受的(你可以定义一个空字符串显示prompt=''
,但是,因为我知道,有没有机会摆脱:
)。
顺便说一句,为了实现同样的目的,使用你的代码,你可以这样做:
python hello.py `echo bob`
首先评估echo bob
,其结果将组成hello.py的参数
嗯,这是一个很老的问题,但无论如何我都会尽力回答。
我觉得点击这么新,我估计,我的解决方案可以得到极大改善。 无论如何,它完全符合你的要求。 这里是:
import click
def get_name(ctx, param, value):
if not value and not click.get_text_stream('stdin').isatty():
return click.get_text_stream('stdin').read().strip()
else:
return value
@click.command()
@click.argument('name', callback=get_name, required=False)
@click.option('--repeat', '-r', default=1)
def say_hello(name, repeat):
for i in range(repeat):
click.echo('Hello {}'.format(name or 'World'))
if __name__ == "__main__":
say_hello()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.