0

I am trying to figure out how to call only one function for any number of commands passed to python click as arguments

so, i want basically main_caller to be called only once not matter how many cmds I have provided

# 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()

Out is

('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'})
1
  • 1
    mmm, don't put a call to main_caller in cli? Commented Feb 24, 2017 at 2:57

1 Answer 1

1

Found the answer. It was using 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()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.