6. PEP 389: The argparse Module for Parsing Command Lines¶
The argparse module for parsing command-line arguments was
added as a more powerful replacement for the
optparse module.
This means Python now supports three different modules for parsing
command-line arguments: getopt, optparse, and
argparse. The getopt module closely resembles the C
library’s getopt() function, so it remains useful if you’re writing a
Python prototype that will eventually be rewritten in C.
optparse becomes redundant, but there are no plans to remove it
because there are many scripts still using it, and there’s no
automated way to update these scripts. (Making the argparse
API consistent with optparse‘s interface was discussed but
rejected as too messy and difficult.)
In short, if you’re writing a new script and don’t need to worry
about compatibility with earlier versions of Python, use
argparse instead of optparse.
Here’s an example:
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is stdin)')
args = parser.parse_args()
print args.__dict__
Unless you override it, -h and --help switches
are automatically added, and produce neatly formatted output:
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]
Command-line example.
positional arguments:
inputs input filenames (default is stdin)
optional arguments:
-h, --help show this help message and exit
-v produce verbose output
-o FILE direct output to FILE instead of stdout
-C NUM display NUM lines of added context
As with optparse, the command-line switches and arguments
are returned as an object with attributes named by the dest parameters:
-> ./python.exe argparse-example.py -v
{'output': None,
'is_verbose': True,
'context': 0,
'inputs': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
'is_verbose': True,
'context': 4,
'inputs': ['file1', 'file2']}
argparse has much fancier validation than optparse; you
can specify an exact number of arguments as an integer, 0 or more
arguments by passing '*', 1 or more by passing '+', or an
optional argument with '?'. A top-level parser can contain
sub-parsers to define subcommands that have different sets of
switches, as in svn commit, svn checkout, etc. You can
specify an argument’s type as FileType, which will
automatically open files for you and understands that '-' means
standard input or output.
See also
argparsedocumentation- The documentation page of the argparse module.
- argparse-from-optparse
- Part of the Python documentation, describing how to convert
code that uses
optparse. - PEP 389 - argparse - New Command Line Parsing Module
- PEP written and implemented by Steven Bethard.