\section{\module{getopt} ---
         Parser for command line options}

\declaremodule{standard}{getopt}
\modulesynopsis{Portable parser for command line options; support both
                short and long option names.}


This module helps scripts to parse the command line arguments in
\code{sys.argv}.
It supports the same conventions as the \UNIX{} \cfunction{getopt()}
function (including the special meanings of arguments of the form
`\code{-}' and `\code{-}\code{-}').
% That's to fool latex2html into leaving the two hyphens alone!
Long options similar to those supported by
GNU software may be used as well via an optional third argument.
This module provides a single function and an exception:

\begin{funcdesc}{getopt}{args, options\optional{, long_options}}
Parses command line options and parameter list.  \var{args} is the
argument list to be parsed, without the leading reference to the
running program. Typically, this means \samp{sys.argv[1:]}.
\var{options} is the string of option letters that the script wants to
recognize, with options that require an argument followed by a colon
(\character{:}; i.e., the same format that \UNIX{}
\cfunction{getopt()} uses).

\strong{Note:} Unlike GNU \cfunction{getopt()}, after a non-option
argument, all further arguments are considered also non-options.
This is similar to the way non-GNU \UNIX{} systems work.

\var{long_options}, if specified, must be a list of strings with the
names of the long options which should be supported.  The leading
\code{'-}\code{-'} characters should not be included in the option
name.  Long options which require an argument should be followed by an
equal sign (\character{=}).  To accept only long options,
\var{options} should be an empty string.  Long options on the command
line can be recognized so long as they provide a prefix of the option
name that matches exactly one of the accepted options.  For example,
it \var{long_options} is \code{['foo', 'frob']}, the option
\longprogramopt{fo} will match as \longprogramopt{foo}, but
\longprogramopt{f} will not match uniquely, so \exception{GetoptError}
will be raised.

The return value consists of two elements: the first is a list of
\code{(\var{option}, \var{value})} pairs; the second is the list of
program arguments left after the option list was stripped (this is a
trailing slice of \var{args}).  Each option-and-value pair returned
has the option as its first element, prefixed with a hyphen for short
options (e.g., \code{'-x'}) or two hyphens for long options (e.g.,
\code{'-}\code{-long-option'}), and the option argument as its second
element, or an empty string if the option has no argument.  The
options occur in the list in the same order in which they were found,
thus allowing multiple occurrences.  Long and short options may be
mixed.
\end{funcdesc}

\begin{excdesc}{GetoptError}
This is raised when an unrecognized option is found in the argument
list or when an option requiring an argument is given none.
The argument to the exception is a string indicating the cause of the
error.  For long options, an argument given to an option which does
not require one will also cause this exception to be raised.  The
attributes \member{msg} and \member{opt} give the error message and
related option; if there is no specific option to which the exception
relates, \member{opt} is an empty string.

\versionchanged[Introduced \exception{GetoptError} as a synonym for
                \exception{error}]{1.6}
\end{excdesc}

\begin{excdesc}{error}
Alias for \exception{GetoptError}; for backward compatibility.
\end{excdesc}


An example using only \UNIX{} style options:

\begin{verbatim}
>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
>>> args
['a1', 'a2']
\end{verbatim}

Using long option names is equally easy:

\begin{verbatim}
>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args = s.split()
>>> args
['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'x', [
...     'condition=', 'output-file=', 'testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x',
 '')]
>>> args
['a1', 'a2']
\end{verbatim}

In a script, typical usage is something like this:

\begin{verbatim}
import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])
    except getopt.GetoptError:
        # print help information and exit:
        usage()
        sys.exit(2)
    output = None
    for o, a in opts:
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        if o in ("-o", "--output"):
            output = a
    # ...

if __name__ == "__main__":
    main()
\end{verbatim}
