通过运行带有Foo()参数的子命令,在主点击组命令上实例化Foo()类

科里奥

我想运行带有可变参数的click子命令,这些参数将用于实例化main()组命令上的Foo(* args)类,以便创建要由其子命令使用的Foo()实例,以便它与点击的工作方式保持一致:

$ python foo.py subcommand arg1 arg2 ... argN

这个问题是基于我最初的问题和@StephenRauch答案。

import click

class Foo(object):
    def __init__(self, *args):
        self.args = args

    def log(self):
        print('self.args:', self.args)

pass_foo = click.make_pass_decorator(Foo)

@click.group()
@click.pass_context
def main(ctx):
    magic_to_get_myargs()

    ctx.obj = Foo(myargs)
    print("main:\n", "ctx.obj.args:", ctx.obj.args)

@main.command()
@click.argument('myargs', nargs=-1)
@pass_foo
def run(foo, myargs):
    magic_to_send_myargs()

    print("run:\n", 'foo.args:', foo.args)
    foo.log()

main()

我希望通过运行子命令来初始化主组命令上的Foo类,并返回其对象以在子命令中使用它。

科里奥

类似的答案中,基于@StephenRauch,我设法自己找到了解决方案。

import click

class MyGroup(click.Group):
    def invoke(self, ctx):
        ctx.obj = tuple(ctx.args)
        super(MyGroup, self).invoke(ctx)

class Foo(object):
    def __init__(self, *args):
        self.args = args

    def log(self):
        print('self.args:', self.args)

pass_foo = click.make_pass_decorator(Foo)

@click.group(cls=MyGroup)
@click.pass_context
def main(ctx):
    ctx.obj = Foo(*ctx.obj)
    print("main:\n", "ctx.obj.args:", ctx.obj.args)

@main.command()
@pass_foo
@click.argument('myargs', nargs=-1)
def run(foo, myargs):
    print("run:\n", 'foo.args:', foo.args)
    foo.log()

if __name__ == "__main__":
    commands = (
        'run arg1 arg2 arg3',
        'run --help',
        '--help',
    )

    import sys, time

    time.sleep(1)
    print('Click Version: {}'.format(click.__version__))
    print('Python Version: {}'.format(sys.version))
    for cmd in commands:
        try:
            time.sleep(0.1)
            print("\n", '-' * 50)
            print('> ' + cmd)
            time.sleep(0.1)
            main(cmd.split())

        except BaseException as exc:
            if str(exc) != '0' and \
                    not isinstance(exc, (click.ClickException, SystemExit)):
                raise

结果

Click Version: 7.0
Python Version: 3.7.2 (default, Dec 29 2018, 06:19:36) 
[GCC 7.3.0]

 --------------------------------------------------
> run arg1 arg2 arg3
main:
 ctx.obj.args: ('arg1', 'arg2', 'arg3')
run:
 foo.args: ('arg1', 'arg2', 'arg3')
self.args: ('arg1', 'arg2', 'arg3')

 --------------------------------------------------
> run --help
main:
 ctx.obj.args: ('--help',)
Usage: test3.py run [OPTIONS] [MYARGS]...

Options:
  --help  Show this message and exit.

 --------------------------------------------------
> --help
Usage: test3.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  run

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

运行带有GNU并行参数的命令

在gulp中运行带有参数的命令

遍历图并返回通过递归调用带有子节点的节点作为参数创建的类实例

(sed命令)-> sed $ foo

带有命令行参数的intelliJ IDEA运行类

如何通过Powershell在其参数中运行带有管道字符的命令?

朱莉娅:无法通过字符串变量运行带有参数的命令

通过带有命令行参数的Ansible剧本多次运行python脚本

在一行的cURL命令上运行带有参数的python

选择Python类在运行时根据用户输入或命令行参数进行实例化

允许用户运行带有参数的命令(其中包含空格)

编写一个运行带有参数的命令的脚本

在PostgreSQL函数中运行带有参数的系统命令

从带有参数的字符串运行命令

在带有参数的docker容器中运行“ apk add”命令

运行带有参数和重定向命令的Bash脚本

在AppleScript中运行带有参数的命令行工具

如何在route中运行带有参数的artisan命令?

限制标准用户运行带有特定参数的命令

对带有可变参数的类使用python click命令

使用Haxe宏实例化带有参数的类

带有2个参数的Ruby实例化类

如何生成密钥对,然后通过ansible SSH进入AWS实例,以在该实例上运行命令

bash脚本运行带有参数的命令并将完整命令记录到文件

在命令内的命令中带有参数的命令

直接使用shell命令(例如foo)和使用$(foo)有什么区别?

显示带有argparse子解析器的命令子组

如何使用Python的子进程模块格式化本身就是一组命令的命令参数?

传递给Controller \ foo的参数1必须是Controller \ foo的实例