How to pass and parse a list of strings from command line with argparse.ArgumentParser in Python?
Question:
I want to pass a list of names into my program written in Python from console. For instance, I would like to use a way similar to this (I know it shouldn’t work because of bash
):
$ python myprog.py -n name1 name2
So, I tried this code:
# myprog.py
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('-n', '--names-list', default=[])
args = parser.parse_args()
print(args.names_list) # I need ['name1', 'name2'] here
That led to the error:
usage: myprog.py [-h] [-n NAMES_LIST]
myprog.py: error: unrecognized arguments: name2
I know I could pass the names with quotes "name1 name2"
and split it in my code args.names_list.split()
. But I’m curious, is there a better way to pass the list of strings via argparse
module.
Any ideas would be appreciated.
Thanks!
Answers:
parser.add_argument('-n', '--names-list', default=[], nargs='+')
You need to define --names-list
to take an arbitrary number of arguments.
parser.add_argument('-n', '--names-list', nargs='+', default=[])
Note that options with arbitrary number of arguments don’t typically play well with positional arguments, though:
# Is this 4 arguments to -n, or
# 3 arguments and a single positional argument, or ...
myprog.py -n a b c d
You need to use nargs
:
parser.add_argument('-n', '--names-list', nargs="*")
I want to pass a list of names into my program written in Python from console. For instance, I would like to use a way similar to this (I know it shouldn’t work because of bash
):
$ python myprog.py -n name1 name2
So, I tried this code:
# myprog.py
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('-n', '--names-list', default=[])
args = parser.parse_args()
print(args.names_list) # I need ['name1', 'name2'] here
That led to the error:
usage: myprog.py [-h] [-n NAMES_LIST]
myprog.py: error: unrecognized arguments: name2
I know I could pass the names with quotes "name1 name2"
and split it in my code args.names_list.split()
. But I’m curious, is there a better way to pass the list of strings via argparse
module.
Any ideas would be appreciated.
Thanks!
parser.add_argument('-n', '--names-list', default=[], nargs='+')
You need to define --names-list
to take an arbitrary number of arguments.
parser.add_argument('-n', '--names-list', nargs='+', default=[])
Note that options with arbitrary number of arguments don’t typically play well with positional arguments, though:
# Is this 4 arguments to -n, or
# 3 arguments and a single positional argument, or ...
myprog.py -n a b c d
You need to use nargs
:
parser.add_argument('-n', '--names-list', nargs="*")