¿Hay alguna forma de persuadir a getopt del pitón para manejar los parámetros opcionales para las opciones?

StackOverflow https://stackoverflow.com/questions/1532737

  •  20-09-2019
  •  | 
  •  

Pregunta

De acuerdo con la documentación sobre getopt de pitón (creo) los campos de opciones deben comportarse como la función getopt(). Sin embargo, me parece que no puede permitir que los parámetros opcionales a mi código:

#!/usr/bin/python
import sys,getopt

if __name__ == "__main__":
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
    except getopt.GetoptError, err:
        print str(err)
        sys.exit(1)

    for o,a in opts:
        if o in ("-v", "--verbose"):
            if a:
                verbose=int(a)
            else:
                verbose=1
            print "verbosity is %d" % (verbose)

Los resultados en:

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
¿Fue útil?

Solución

getopt no admite parámetros opcionales. en el caso de la opción de largo que podría hacer:

$ ./testopt.py --verbose=

que se traducirá en valor vacío cuerdas.

Se puede encontrar argparse módulo para ser más flexible.

Otros consejos

Desafortunadamente, no hay manera. Desde el optparse docs :

  

Por lo general, una opción dada ya sea toma un argumento, o no lo hace. Mucha gente quiere una función de “argumentos de opciones opcionales”, lo que significa que algunas opciones se tomarán un argumento si lo ven, y no si no lo hacen. Esto es algo controvertido, ya que hace que el análisis ambigua: si "una" toma un argumento opcional y "B" es otra opción del todo, ¿cómo interpretar "AB"? Debido a esta ambigüedad, optparse no soporta esta característica.

EDIT:. uy, es decir, para el módulo no optparse el módulo getopt, pero el razonamiento por qué ni módulo tiene "argumentos opcionales opción" es la misma para ambos

Puede hacer un parámetro opcional con getopt como esto:

import getopt
import sys

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)

if argDict.has_key('--env') and argDict['--env'] == 'prod':
    print "production"
else:
    print "sandbox"

Uso:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

Si está utilizando la versión 2.3 o posterior, es posible que desee probar el optparse módulo en lugar, ya que es "más cómoda, flexible y de gran alcance ...", así como la más reciente. Por desgracia, como respondió Pynt, no parece posible conseguir exactamente lo que quiere.

getopt de pitón en realidad debería apoyar argumentos opcionales, como getopt GNU exigiendo '=' ser utilizado cuando se especifica un parámetro. Ahora se puede simular con bastante facilidad, sin embargo, con esta limitación por implícitamente cambiar --option a --option =

I.E. puede especificar que --option requiere un argumento, y luego ajustar --option a --option = como sigue:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top