xref: /third_party/python/Doc/library/getopt.rst (revision 7db96d56)
17db96d56Sopenharmony_ci:mod:`getopt` --- C-style parser for command line options
27db96d56Sopenharmony_ci=========================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: getopt
57db96d56Sopenharmony_ci   :synopsis: Portable parser for command line options; support both short and
67db96d56Sopenharmony_ci              long option names.
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci**Source code:** :source:`Lib/getopt.py`
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci.. note::
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci   The :mod:`getopt` module is a parser for command line options whose API is
137db96d56Sopenharmony_ci   designed to be familiar to users of the C :c:func:`getopt` function. Users who
147db96d56Sopenharmony_ci   are unfamiliar with the C :c:func:`getopt` function or who would like to write
157db96d56Sopenharmony_ci   less code and get better help and error messages should consider using the
167db96d56Sopenharmony_ci   :mod:`argparse` module instead.
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci--------------
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciThis module helps scripts to parse the command line arguments in ``sys.argv``.
217db96d56Sopenharmony_ciIt supports the same conventions as the Unix :c:func:`getopt` function (including
227db96d56Sopenharmony_cithe special meanings of arguments of the form '``-``' and '``--``').  Long
237db96d56Sopenharmony_cioptions similar to those supported by GNU software may be used as well via an
247db96d56Sopenharmony_cioptional third argument.
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciThis module provides two functions and an
277db96d56Sopenharmony_ciexception:
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci.. function:: getopt(args, shortopts, longopts=[])
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci   Parses command line options and parameter list.  *args* is the argument list to
337db96d56Sopenharmony_ci   be parsed, without the leading reference to the running program. Typically, this
347db96d56Sopenharmony_ci   means ``sys.argv[1:]``. *shortopts* is the string of option letters that the
357db96d56Sopenharmony_ci   script wants to recognize, with options that require an argument followed by a
367db96d56Sopenharmony_ci   colon (``':'``; i.e., the same format that Unix :c:func:`getopt` uses).
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci   .. note::
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci      Unlike GNU :c:func:`getopt`, after a non-option argument, all further
417db96d56Sopenharmony_ci      arguments are considered also non-options. This is similar to the way
427db96d56Sopenharmony_ci      non-GNU Unix systems work.
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci   *longopts*, if specified, must be a list of strings with the names of the
457db96d56Sopenharmony_ci   long options which should be supported.  The leading ``'--'`` characters
467db96d56Sopenharmony_ci   should not be included in the option name.  Long options which require an
477db96d56Sopenharmony_ci   argument should be followed by an equal sign (``'='``).  Optional arguments
487db96d56Sopenharmony_ci   are not supported.  To accept only long options, *shortopts* should be an
497db96d56Sopenharmony_ci   empty string.  Long options on the command line can be recognized so long as
507db96d56Sopenharmony_ci   they provide a prefix of the option name that matches exactly one of the
517db96d56Sopenharmony_ci   accepted options.  For example, if *longopts* is ``['foo', 'frob']``, the
527db96d56Sopenharmony_ci   option ``--fo`` will match as ``--foo``, but ``--f`` will
537db96d56Sopenharmony_ci   not match uniquely, so :exc:`GetoptError` will be raised.
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci   The return value consists of two elements: the first is a list of ``(option,
567db96d56Sopenharmony_ci   value)`` pairs; the second is the list of program arguments left after the
577db96d56Sopenharmony_ci   option list was stripped (this is a trailing slice of *args*).  Each
587db96d56Sopenharmony_ci   option-and-value pair returned has the option as its first element, prefixed
597db96d56Sopenharmony_ci   with a hyphen for short options (e.g., ``'-x'``) or two hyphens for long
607db96d56Sopenharmony_ci   options (e.g., ``'--long-option'``), and the option argument as its
617db96d56Sopenharmony_ci   second element, or an empty string if the option has no argument.  The
627db96d56Sopenharmony_ci   options occur in the list in the same order in which they were found, thus
637db96d56Sopenharmony_ci   allowing multiple occurrences.  Long and short options may be mixed.
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci.. function:: gnu_getopt(args, shortopts, longopts=[])
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci   This function works like :func:`getopt`, except that GNU style scanning mode is
697db96d56Sopenharmony_ci   used by default. This means that option and non-option arguments may be
707db96d56Sopenharmony_ci   intermixed. The :func:`getopt` function stops processing options as soon as a
717db96d56Sopenharmony_ci   non-option argument is encountered.
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci   If the first character of the option string is ``'+'``, or if the environment
747db96d56Sopenharmony_ci   variable :envvar:`POSIXLY_CORRECT` is set, then option processing stops as
757db96d56Sopenharmony_ci   soon as a non-option argument is encountered.
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci.. exception:: GetoptError
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci   This is raised when an unrecognized option is found in the argument list or when
817db96d56Sopenharmony_ci   an option requiring an argument is given none. The argument to the exception is
827db96d56Sopenharmony_ci   a string indicating the cause of the error.  For long options, an argument given
837db96d56Sopenharmony_ci   to an option which does not require one will also cause this exception to be
847db96d56Sopenharmony_ci   raised.  The attributes :attr:`msg` and :attr:`opt` give the error message and
857db96d56Sopenharmony_ci   related option; if there is no specific option to which the exception relates,
867db96d56Sopenharmony_ci   :attr:`opt` is an empty string.
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci.. XXX deprecated?
897db96d56Sopenharmony_ci.. exception:: error
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci   Alias for :exc:`GetoptError`; for backward compatibility.
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ciAn example using only Unix style options:
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci   >>> import getopt
967db96d56Sopenharmony_ci   >>> args = '-a -b -cfoo -d bar a1 a2'.split()
977db96d56Sopenharmony_ci   >>> args
987db96d56Sopenharmony_ci   ['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
997db96d56Sopenharmony_ci   >>> optlist, args = getopt.getopt(args, 'abc:d:')
1007db96d56Sopenharmony_ci   >>> optlist
1017db96d56Sopenharmony_ci   [('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
1027db96d56Sopenharmony_ci   >>> args
1037db96d56Sopenharmony_ci   ['a1', 'a2']
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ciUsing long option names is equally easy:
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci   >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
1087db96d56Sopenharmony_ci   >>> args = s.split()
1097db96d56Sopenharmony_ci   >>> args
1107db96d56Sopenharmony_ci   ['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
1117db96d56Sopenharmony_ci   >>> optlist, args = getopt.getopt(args, 'x', [
1127db96d56Sopenharmony_ci   ...     'condition=', 'output-file=', 'testing'])
1137db96d56Sopenharmony_ci   >>> optlist
1147db96d56Sopenharmony_ci   [('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]
1157db96d56Sopenharmony_ci   >>> args
1167db96d56Sopenharmony_ci   ['a1', 'a2']
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ciIn a script, typical usage is something like this::
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci   import getopt, sys
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci   def main():
1237db96d56Sopenharmony_ci       try:
1247db96d56Sopenharmony_ci           opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
1257db96d56Sopenharmony_ci       except getopt.GetoptError as err:
1267db96d56Sopenharmony_ci           # print help information and exit:
1277db96d56Sopenharmony_ci           print(err)  # will print something like "option -a not recognized"
1287db96d56Sopenharmony_ci           usage()
1297db96d56Sopenharmony_ci           sys.exit(2)
1307db96d56Sopenharmony_ci       output = None
1317db96d56Sopenharmony_ci       verbose = False
1327db96d56Sopenharmony_ci       for o, a in opts:
1337db96d56Sopenharmony_ci           if o == "-v":
1347db96d56Sopenharmony_ci               verbose = True
1357db96d56Sopenharmony_ci           elif o in ("-h", "--help"):
1367db96d56Sopenharmony_ci               usage()
1377db96d56Sopenharmony_ci               sys.exit()
1387db96d56Sopenharmony_ci           elif o in ("-o", "--output"):
1397db96d56Sopenharmony_ci               output = a
1407db96d56Sopenharmony_ci           else:
1417db96d56Sopenharmony_ci               assert False, "unhandled option"
1427db96d56Sopenharmony_ci       # ...
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci   if __name__ == "__main__":
1457db96d56Sopenharmony_ci       main()
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ciNote that an equivalent command line interface could be produced with less code
1487db96d56Sopenharmony_ciand more informative help and error messages by using the :mod:`argparse` module::
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci   import argparse
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci   if __name__ == '__main__':
1537db96d56Sopenharmony_ci       parser = argparse.ArgumentParser()
1547db96d56Sopenharmony_ci       parser.add_argument('-o', '--output')
1557db96d56Sopenharmony_ci       parser.add_argument('-v', dest='verbose', action='store_true')
1567db96d56Sopenharmony_ci       args = parser.parse_args()
1577db96d56Sopenharmony_ci       # ... do something with args.output ...
1587db96d56Sopenharmony_ci       # ... do something with args.verbose ..
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci.. seealso::
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci   Module :mod:`argparse`
1637db96d56Sopenharmony_ci      Alternative command line option and argument parsing library.
1647db96d56Sopenharmony_ci
165