\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).

\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,
if \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{funcdesc}{gnu_getopt}{args, options\optional{, long_options}}
This function works like \function{getopt()}, except that GNU style
scanning mode is used by default. This means that option and
non-option arguments may be intermixed. The \function{getopt()}
function stops processing options as soon as a non-option argument is
encountered.

If the first character of the option string is `+', or if the
environment variable POSIXLY_CORRECT is set, then option processing
stops as soon as a non-option argument is encountered.

\versionadded{2.3}
\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:v", ["help", "output="])
    except getopt.GetoptError, err:
        # print help information and exit:
        print str(err) # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        elif o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-o", "--output"):
            output = a
        else:
            assert False, "unhandled option"
    # ...

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

\begin{seealso}
  \seemodule{optparse}{More object-oriented command line option parsing.}
\end{seealso}
