¿Hay alguna forma de persuadir a getopt del pitón para manejar los parámetros opcionales para las opciones?
-
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
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