How to pass an entire list as command line argument in Python?
Command line arguments are always passed as strings. You will need to parse them into your required data type yourself.
>>> input = "[2,3,4,5]"
>>> map(float, input.strip('[]').split(','))
[2.0, 3.0, 4.0, 5.0]
>>> A = map(float, input.strip('[]').split(','))
>>> print(A, type(A))
([2.0, 3.0, 4.0, 5.0], <type 'list'>)
There are libraries like argparse and click that let you define your own argument type conversion but argparse
treats "[2,3,4]"
the same as [
2
,
3
,
4
]
so I doubt it will be useful.
edit Jan 2019 This answer seems to get a bit of action still so I'll add another option taken directly from the argparse docs.
You can use action=append
to allow repeated arguments to be collected into a single list.
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
In this case you would pass --foo ?
once for each list item. Using OPs example: python filename.py --foo 2 --foo 3 --foo 4 --foo 5
would result in foo=[2,3,4,5]
I tested this on my end, and my input looks like this:
python foo.py "[1,2,3,4]" "[5,6,7,8,9]"
I'm doing the following to convert the two params of interest:
import ast
import sys
list1 = ast.literal_eval(sys.argv[1])
list2 = ast.literal_eval(sys.argv[2])
Don't reinvent the wheel. Use the argparse module, be explicit and pass in actual lists of parameters
import argparse
# defined command line options
# this also generates --help and error handling
CLI=argparse.ArgumentParser()
CLI.add_argument(
"--lista", # name on the CLI - drop the `--` for positional/required parameters
nargs="*", # 0 or more values expected => creates a list
type=int,
default=[1, 2, 3], # default if nothing is provided
)
CLI.add_argument(
"--listb",
nargs="*",
type=float, # any type/callable can be used here
default=[],
)
# parse the command line
args = CLI.parse_args()
# access CLI options
print("lista: %r" % args.lista)
print("listb: %r" % args.listb)
You can then call it using
$ python my_app.py --listb 5 6 7 8 --lista 1 2 3 4
lista: [1, 2, 3, 4]
listb: [5.0, 6.0, 7.0, 8.0]