I'm trying to parse a command-line in Python which looks like the following:
$ ./command -o option1 arg1 -o option2 arg2 arg3
In other words, the command takes an unlimited number of arguments, and each argument may optionally be preceded with an -o
option, which relates specifically to that argument. I think this is called a "prefix notation".
In the Bourne shell I would do something like the following:
while test -n "$1"
do
if test "$1" = '-o'
then
option="$2"
shift 2
fi
# Work with $1 (the argument) and $option (the option)
# ...
shift
done
Looking around at the Bash tutorials, etc. this seems to be the accepted idiom, so I'm guessing Bash is optimized to work with command-line arguments this way.
Trying to implement this pattern in Python, my first guess was to use pop()
, as this is basically a stack operation. But I'm guessing this won't work as well on Python because the list of arguments in sys.argv
is in the wrong order and would have to be processed like a queue (i.e. pop from the left). I've read that lists are not optimized for use as queues in Python.
So, my ideas are: convert argv
to a collections.deque
and use popleft()
, reverse argv
using reverse()
and use pop()
, or maybe just work with the int list indices themselves.
Does anyone know of a better way to do this, otherwise which of my ideas would be best-practise in Python?
To pass command line arguments, we typically define main() with two arguments : first argument is the number of command line arguments and second is list of command-line arguments. The value of argc should be non negative.
The Python supports the programs that can be run on the command line, complete with command line arguments. It is the input parameter that needs to be passed to the script when executing them. It means to interact with a command-line interface for the scripts.
A Python functional equivalent of "shift" in Bourne/Bash can be had by importing sys, then assigning sys.argv[1:] to a variable, e.g. "args". Then you can use args = args[1:] to shift left once, or use a higher number to shift multiple times. The argument index will start from 0, rather than 1. The example above could look look like:
import sys
args = sys.argv[1:]
while len(args):
if args[0] == '-o':
option = args[1]
args = args[2:] # shift 2
# Work with args[0] (the argument) and option (the option)
# ...
args = args[1:] # shift
p = argparse.ArgumentParser()
p.add_argument('-o', action='append')
for i in range(1, 4): p.add_argument('arg%d' % i)
args = p.parse_args('-o option1 arg1 -o option2 arg2 arg3'.split())
print args
# -> Namespace(arg1='arg1', arg2='arg2', arg3='arg3', o=['option1', 'option2'])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With