# `getopt` — Analizador de estilo C para opciones de línea de comando

Código fuente: Lib/getopt.py

Nota

El módulo `getopt` es un analizador de opciones de línea de comando cuya API está diseñada para que los usuarios de la función C `getopt()` estén familiarizados. Los usuarios que no estén familiarizados con la función C `getopt()` o que deseen escribir menos código y obtener mejor ayuda y mensajes de error deberían considerar el uso del módulo `argparse`.

Este módulo ayuda a los scripts a analizar los argumentos de la línea de comandos en `sys.argv`. Admite las mismas convenciones que la función Unix `getopt()` (incluidos los significados especiales de los argumentos de la forma “`-`” y “`--`“). También se pueden usar opciones largas similares a las admitidas por el software GNU a través de un tercer argumento opcional.

Este módulo proporciona dos funciones y una excepción:

getopt.getopt(args, shortopts, longopts=[])

  Analiza las opciones de la línea de comandos y la lista de parámetros. args es la lista de argumentos a analizar, sin la referencia principal al programa en ejecución. Por lo general, esto significa `sys.argv[:]`. shortopts es la cadena de letras de opciones que el script quiere reconocer, con opciones que requieren un argumento seguido de dos puntos (`':'`; es decir, el mismo formato que Unix `getopt()` usa).

  Nota

  A diferencia de GNU `getopt()`, después de un argumento no-opcional, todos los argumentos adicionales se consideran también no-opcionales. Esto es similar a la forma en que funcionan los sistemas Unix que no son GNU.

  longopts, si se especifica, debe ser una lista de cadenas con los nombres de las opciones largas que deben admitirse. Los caracteres principales `'-'` no deben incluirse en el nombre de la opción. Las opciones largas que requieren un argumento deben ir seguidas de un signo igual (`'='`). Los argumentos opcionales no son compatibles. Para aceptar solo opciones largas, shortopts debe ser una cadena vacía. Las opciones largas en la línea de comando pueden reconocerse siempre que proporcionen un prefijo del nombre de la opción que coincida exactamente con una de las opciones aceptadas. Por ejemplo, si longopts es `['foo', 'frob']`, la opción `--fo` coincidirá como `--foo`, pero `--f` no coincidirá de forma exclusiva, por lo que se lanzará `GetoptError`.

  El valor de retorno consta de dos elementos: el primero es una lista de pares `(option, value)`; el segundo es la lista de argumentos del programa que quedan después de que se eliminó la lista de opciones (esta es una porción final de args). Cada par de opción y valor retornado tiene la opción como su primer elemento, con un guión para las opciones cortas (por ejemplo, `'-x'`) o dos guiones para las opciones largas (por ejemplo, `'--long-option'`), y el argumento de la opción como su segundo elemento, o una cadena vacía si la opción no tiene argumento. Las opciones aparecen en la lista en el mismo orden en que se encontraron, lo que permite múltiples ocurrencias. Las opciones largas y cortas pueden ser mixtas.

getopt.gnu_getopt(args, shortopts, longopts=[])

  Esta función funciona como `getopt()`, excepto que el modo de escaneo estilo GNU se usa por defecto. Esto significa que los argumentos opcionales y no opcionales pueden estar mezclados. La función `getopt()` detiene el procesamiento de opciones tan pronto como se encuentra un argumento no-opcionales.

  Si el primer carácter de la cadena de opciones es `'+'`, o si la variable de entorno `POSIXLY_CORRECT` está configurada, el procesamiento de opciones se detiene tan pronto como se encuentre un argumento que no sea de opción.

exception getopt.GetoptError

  Esto se lanza cuando se encuentra una opción no reconocida en la lista de argumentos o cuando una opción que requiere un argumento no recibe ninguna. El argumento de la excepción es una cadena que indica la causa del error. Para opciones largas, un argumento dado a una opción que no requiere una también provocará que se lance esta excepción. Los atributos `msg` y `opt` dan el mensaje de error y la opción relacionada; si no hay una opción específica con la cual se relaciona la excepción, `opt` es una cadena vacía.

exception getopt.error

  Alias para `GetoptError`; para compatibilidad con versiones anteriores.

Un ejemplo que usa solo opciones de estilo Unix:

    >>> 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']

Usar nombres largos de opciones es igualmente fácil:

    >>> 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']

En un script, el uso típico es algo como esto:

    import getopt, sys

    def main():
        try:
            opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
        except getopt.GetoptError as err:
            # print help information and exit:
            print(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()

Tenga en cuenta que se podría generar una interfaz de línea de comando equivalente con menos código y más ayuda informativa y mensajes de error utilizando el módulo `argparse`:

    import argparse

    if __name__ == '__main__':
        parser = argparse.ArgumentParser()
        parser.add_argument('-o', '--output')
        parser.add_argument('-v', dest='verbose', action='store_true')
        args = parser.parse_args()
        # ... do something with args.output ...
        # ... do something with args.verbose ..

Ver también

Módulo `argparse`

  Opción de línea de comando alternativa y biblioteca de análisis de argumentos.