python-3.xpython-click

Accept arbitrary arguments and options with Click


I'm writing a Python wrapper around another program. I want the user to be able to specify a few options for the wrapper and then pass the rest of the command-line through to the wrapped program. Something like this:

@click.command()
@click.option("--port", type=int)
@click.argument("args", nargs=-1)
def main(port, args):
    call_the_wrapped_program(port=port, args=args)

But this dies with Error: no such option: -k because it treats any command-line switch as something it should parse rather than an argument that can be added to args.

Is this possible?


Solution

  • The Forwarding Unknown Options section in the documentation covers this use case. You should be able to write something like this:

    @click.command(context_settings=dict(
        ignore_unknown_options=True,
    ))
    @click.option("--port", type=int)
    @click.argument("args", nargs=-1, type=click.UNPROCESSED)
    def main(port, args):
        call_the_wrapped_program(port=port, args=args)