Revisión de requisitos
- usar
argparse
(ignoraré este)
- permitir que se invoquen una o dos acciones (se requiere al menos una).
- intentar por Pythonic (prefiero llamarlo "POSIX" -como)
También hay algunos requisitos implícitos cuando se vive en la línea de comandos:
- explicar el uso al usuario de una manera que sea fácil de entender
- las opciones serán opcionales
- permitir especificar banderas y opciones
- permiten combinar con otros parámetros (como nombre de archivo o nombres).
Solución de muestra usando docopt
(archivo managelog.py
):
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Intenta ejecutarlo:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Muestre la ayuda:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
Y úsalo:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
Alternativa corta short.py
Puede haber una variante incluso más corta:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
El uso se ve así:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
Tenga en cuenta que, en lugar de valores booleanos para las claves de "proceso" y "carga", hay contadores.
Resulta que no podemos evitar la duplicación de estas palabras:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
Conclusiones
En ocasiones, diseñar una buena interfaz de línea de comandos puede ser un desafío.
Hay varios aspectos del programa basado en la línea de comandos:
- buen diseño de línea de comando
- seleccionar / usar el analizador adecuado
argparse
ofrece mucho, pero restringe los posibles escenarios y puede volverse muy complejo.
Con las docopt
cosas van mucho más cortas conservando la legibilidad y ofreciendo un alto grado de flexibilidad. Si logra obtener argumentos analizados del diccionario y realiza algunas conversiones (a números enteros, abrir archivos ...) manualmente (o mediante otra biblioteca llamada schema
), puede encontrar una docopt
buena opción para el análisis de línea de comandos.
-x
es universalmente una bandera y opcional. Corta el-
si es necesario.