66

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!

Fomalhaut
  • 8,590
  • 8
  • 51
  • 95

3 Answers3

86

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
chepner
  • 497,756
  • 71
  • 530
  • 681
16

You need to use nargs:

parser.add_argument('-n', '--names-list', nargs="*")

https://docs.python.org/3/library/argparse.html#nargs

liiight
  • 321
  • 1
  • 8
4
parser.add_argument('-n', '--names-list', default=[], nargs='+')
hello world
  • 596
  • 2
  • 12