Say I have a list of strings containing arguments and options, with argparse
, I’m able to parse this list using the parse_args
function into an object, as follows:
import argparse
extra_params = [‘—sum’, ‘7’, ‘-1’, ‘42’]
parser=argparse.ArgumentParser(description=“argparse docs example”)
parser.add_argument(‘integers’, metavar=‘N’, type=int, nargs=‘+’,
help=‘an integer for the accumulator’)
parser.add_argument(‘—sum’, dest=‘accumulate’, action=‘store_const’,
const=sum, default=max,
help=‘sum the integers (default: find the max)’)
parsed_object=parser.parse_args(extra_params)
Here, argparse
has parsed a provided iterable of strings. Can one use click
to also parse a provided iterable of strings?
I’ve searched through the API documentation for click
and it appears that there’s a parse_args
function within the *Command
set of classes but don’t see anything in the docs around how I can do this. I’ve tried instantiating BaseCommand
as well as Command
but not sure how to get parse_args
working without a correct context.
For broader context, this question is a result of having built a launcher application that end users use as a scaffold to launch their own applications. Here, the launcher consumes a number of arguments for which click decorators work perfectly. Unknown arguments can be handled as shown in the documentation here. This launcher then calls an end-user provided callable with these unparsed parameters. Click leaves unparsed parameters as a tuple of strings. How would the end-user, in this situation, be able to use Click to parse the argument's they're interested in? Here's a snippet to illustrate the issue:
import click
from typing import Tuple
@click.command(name="TestLauncher", context_settings={
"ignore_unknown_options": True
})
@click.option('--uri', '-u',
help="URI for the server")
@click.argument('unprocessed_args', nargs=-1,
type=click.UNPROCESSED)
def main(uri: str, unprocessed_args: Tuple[str, ...]) -> None:
print(f"Was passed a URI of {uri}")
print(f"Additional args are {unprocessed_args}")
child_function(unprocessed_args)
def child_function(unprocessed_args: Tuple[str, ...]) -> None:
# How do I get Click to parse the provided args for me?
pass
if __name__ == "__main__":
# pylint: disable=no-value-for-parameter, unexpected-keyword-arg
main()
Running this from the command line:
python3 so_test.py --uri test.com --prog-arg 10
Was passed a URI of test.com
Additional args are ('--prog-arg', '10')
extra_params
is simulating the input normally read from the commandline (viasys.argv[1:]
). This is most commonly use for testing (I use it frequently in SO answers).parsed_object
or its equivalent could also be constructed directly. – Asia