我想使用一些有用的函数作为命令.为此我正在测试click库.我定义了我的三个原始函数,然后装饰为click.command:
import click
import os, sys
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=True)
def add_name(content, to_stdout=False):
if not content:
content = ''.join(sys.stdin.readlines())
result = content + "\n\tadded name"
if to_stdout is True:
sys.stdout.writelines(result)
return result
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=True)
def add_surname(content, to_stdout=False):
if not content:
content = ''.join(sys.stdin.readlines())
result = content + "\n\tadded surname"
if to_stdout is True:
sys.stdout.writelines(result)
return result
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=False)
def add_name_and_surname(content, to_stdout=False):
result = add_surname(add_name(content))
if to_stdout is True:
sys.stdout.writelines(result) …Run Code Online (Sandbox Code Playgroud) 我想要一个命令行工具,其用法如下:
$ program <arg> does something, no command name required
$ program cut <arg>
$ program eat <arg>
Run Code Online (Sandbox Code Playgroud)
Click 代码如下所示:
@click.group()
def main() :
pass
@main.command()
@click.argument('arg')
def noname(arg) :
# does stuff
@main.command()
@click.argument('arg')
def cut(arg) :
# cuts stuff
@main.command()
@click.argument('arg')
def eat(arg) :
# eats stuff
Run Code Online (Sandbox Code Playgroud)
我的问题是,对于这段代码,总是有一个必需的命令名称,即:我需要运行$ program noname arg. 但我希望能够运行$ program arg.
我最近一直在使用click 包来构建命令行界面,到目前为止,它运行良好。
现在我在将链接命令与上下文对象结合使用时遇到了一些麻烦。问题是当我想从另一个命令中调用另一个命令的函数时,我以某种方式收到错误。
这可能与 click 中装饰器的使用有某种关系,但我现在没有看到错误。
这是我的代码的最小示例:
import click
@click.group(chain=True)
@click.option('--some_common_option', type=float, default=1e-10)
@click.pass_context
def cli(ctx, some_common_option):
# save shared params within context object for different commands
for k, v in locals().items():
if 'ctx' not in k:
ctx.obj[k] = v
return True
@cli.command()
@click.argument('some_argument', type=str)
@click.pass_context
def say_something(ctx, some_argument):
print(some_argument)
return True
@cli.command()
@click.argument('some_other_argument', type=str)
@click.pass_context
def say_more(ctx, some_other_argument):
ctx.obj['text'] = some_other_argument
say_something(ctx, ctx.obj['text'])
return True
if __name__ == '__main__':
cli(obj={})
Run Code Online (Sandbox Code Playgroud)
这是终端上提供的错误:
$ python test.py say_something 'Hello!'
Hello! …Run Code Online (Sandbox Code Playgroud)