0

我试图弄清楚如何只为click作为参数传递给 python 的任意数量的命令调用一个函数

main_caller所以,无论我提供了多少个 cmd ,我基本上只想被调用一次

# http://click.pocoo.org/5/commands/

import click

def main_caller(*args, **kwargs):
    print('act on arguments', args, kwargs)

@click.group(help='wwwwwwwwww', epilog='wwwwxx', invoke_without_command=True, chain=True)
@click.option('-v', '--verbose', default=False, help='Print Verbose messages')
@click.option('-l', '--logfile', help='Path to logfile to store log messages')
@click.option('-a', '--action', multiple=True, type=click.Choice(['act1', 'act2', 'act3']), default=['act1', 'act2'])
@click.pass_context
def cli(*args, **kwargs):
    '''foo bar'''
    print('cli', args, kwargs)
    main_caller(*args, **kwargs)

@cli.command()
@click.option('--debug/--no-debug', default=False)
@click.pass_context
def cmd1(*args, **kwargs):
    print('cmd1', args, kwargs)
    main_caller(*args, **kwargs)

@cli.command()
@click.option('-x', '--xxx', default='x')
@click.pass_context
def cmd2(*args, **kwargs):
    print('cmd2', args, kwargs)
    main_caller(*args, **kwargs)


if __name__ == '__main__':
    cli()

出是

('cli', (<click.core.Context object at 0x7f095a858150>,), {'action': ('act1', 'act2'), 'logfile': None, 'verbose': False})
('act on arguments', (<click.core.Context object at 0x7f095a858150>,), {'action': ('act1', 'act2'), 'logfile': None, 'verbose': False})
('cmd1', (<click.core.Context object at 0x7f095a858190>,), {'debug': False})
('act on arguments', (<click.core.Context object at 0x7f095a858190>,), {'debug': False})
('cmd2', (<click.core.Context object at 0x7f095a8581d0>,), {'xxx': u'x'})
('act on arguments', (<click.core.Context object at 0x7f095a8581d0>,), {'xxx': u'x'})
4

1 回答 1

1

找到了答案。它正在使用resultcallback()

# http://click.pocoo.org/5/commands/

import click

def main_caller(*args, **kwargs):
    print('act on arguments', args, kwargs)

@click.group(help='wwwwwwwwww', epilog='wwwwxx', invoke_without_command=True, chain=True)
@click.option('-v', '--verbose', default=False, help='Print Verbose messages')
@click.option('-l', '--logfile', help='Path to logfile to store log messages')
@click.option('-a', '--action', multiple=True, type=click.Choice(['act1', 'act2', 'act3']), default=['act1', 'act2'])
def cli(*args, **kwargs):
    '''foo bar'''
    pass

@cli.command()
@click.option('--debug/--no-debug', default=False)
def cmd1(*args, **kwargs):
    print('cmd1', args, kwargs)
    return 'cmd11111'

@cli.command()
@click.option('-x', '--xxx', default='x')
def cmd2(*args, **kwargs):
    print('cmd2', args, kwargs)
    return 'cmd22222'

@cli.resultcallback()
def process_pipeline(*args, **kwargs):
    print('process', args, kwargs)
#     iterator = (x.rstrip('\r\n') for x in input1)
#     for processor in processors:
#         iterator = processor(iterator)
#     for item in iterator:
#         click.echo(item)


if __name__ == '__main__':
    cli()
于 2017-02-24T03:29:37.163 回答