Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the best way to parse command line arguments? [closed]

What's the easiest, tersest, and most flexible method or library for parsing Python command line arguments?

like image 529
kamens Avatar asked Aug 21 '08 14:08

kamens


People also ask

Which is not used for parsing command line arguments automatically?

Getopt is not used for parsing command-line arguments automatically.

What is arg parsing?

argparse — parse the arguments. Using argparse is how you let the user of your program provide values for variables at runtime. It's a means of communication between the writer of a program and the user. That user might be your future self.


2 Answers

argparse is the way to go. Here is a short summary of how to use it:

1) Initialize

import argparse  # Instantiate the parser parser = argparse.ArgumentParser(description='Optional app description') 

2) Add Arguments

# Required positional argument parser.add_argument('pos_arg', type=int,                     help='A required integer positional argument')  # Optional positional argument parser.add_argument('opt_pos_arg', type=int, nargs='?',                     help='An optional integer positional argument')  # Optional argument parser.add_argument('--opt_arg', type=int,                     help='An optional integer argument')  # Switch parser.add_argument('--switch', action='store_true',                     help='A boolean switch') 

3) Parse

args = parser.parse_args() 

4) Access

print("Argument values:") print(args.pos_arg) print(args.opt_pos_arg) print(args.opt_arg) print(args.switch) 

5) Check Values

if args.pos_arg > 10:     parser.error("pos_arg cannot be larger than 10") 

Usage

Correct use:

$ ./app 1 2 --opt_arg 3 --switch  Argument values: 1 2 3 True 

Incorrect arguments:

$ ./app foo 2 --opt_arg 3 --switch usage: convert [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg] app: error: argument pos_arg: invalid int value: 'foo'  $ ./app 11 2 --opt_arg 3 Argument values: 11 2 3 False usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg] convert: error: pos_arg cannot be larger than 10 

Full help:

$ ./app -h  usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]  Optional app description  positional arguments:   pos_arg            A required integer positional argument   opt_pos_arg        An optional integer positional argument  optional arguments:   -h, --help         show this help message and exit   --opt_arg OPT_ARG  An optional integer argument   --switch           A boolean switch 
like image 164
Andrzej Pronobis Avatar answered Sep 21 '22 14:09

Andrzej Pronobis


This answer suggests optparse which is appropriate for older Python versions. For Python 2.7 and above, argparse replaces optparse. See this answer for more information.

As other people pointed out, you are better off going with optparse over getopt. getopt is pretty much a one-to-one mapping of the standard getopt(3) C library functions, and not very easy to use.

optparse, while being a bit more verbose, is much better structured and simpler to extend later on.

Here's a typical line to add an option to your parser:

parser.add_option('-q', '--query',             action="store", dest="query",             help="query string", default="spam") 

It pretty much speaks for itself; at processing time, it will accept -q or --query as options, store the argument in an attribute called query and has a default value if you don't specify it. It is also self-documenting in that you declare the help argument (which will be used when run with -h/--help) right there with the option.

Usually you parse your arguments with:

options, args = parser.parse_args() 

This will, by default, parse the standard arguments passed to the script (sys.argv[1:])

options.query will then be set to the value you passed to the script.

You create a parser simply by doing

parser = optparse.OptionParser() 

These are all the basics you need. Here's a complete Python script that shows this:

import optparse  parser = optparse.OptionParser()  parser.add_option('-q', '--query',     action="store", dest="query",     help="query string", default="spam")  options, args = parser.parse_args()  print 'Query string:', options.query 

5 lines of python that show you the basics.

Save it in sample.py, and run it once with

python sample.py 

and once with

python sample.py --query myquery 

Beyond that, you will find that optparse is very easy to extend. In one of my projects, I created a Command class which allows you to nest subcommands in a command tree easily. It uses optparse heavily to chain commands together. It's not something I can easily explain in a few lines, but feel free to browse around in my repository for the main class, as well as a class that uses it and the option parser

like image 40
Thomas Vander Stichele Avatar answered Sep 22 '22 14:09

Thomas Vander Stichele