Examen des exigences
- utiliser
argparse
(je vais ignorer celui-ci)
- permettent d'appeler une ou deux actions (au moins une requise).
- essayez par Pythonic (je l'appellerais plutôt "POSIX")
Il existe également des exigences implicites lorsque l'on vit en ligne de commande:
- expliquer l'utilisation à l'utilisateur d'une manière qui est facile à comprendre
- les options doivent être facultatives
- permettre de spécifier des indicateurs et des options
- permettent la combinaison avec d'autres paramètres (comme le nom ou les noms de fichier).
Exemple de solution utilisant docopt
(fichier 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
Essayez de l'exécuter:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Montrez l'aide:
$ 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>
Et utilisez-le:
$ 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}
Alternative courte short.py
Il peut y avoir une variante encore plus courte:
"""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
L'utilisation ressemble à ceci:
$ 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}
Notez qu'au lieu de valeurs booléennes pour les clés "process" et "upload", il y a des compteurs.
Il s'avère que nous ne pouvons pas empêcher la duplication de ces mots:
$ 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}
Conclusions
Concevoir une bonne interface de ligne de commande peut parfois être difficile.
Il existe plusieurs aspects du programme basé sur la ligne de commande:
- bonne conception de la ligne de commande
- sélectionner / utiliser un analyseur approprié
argparse
offre beaucoup, mais restreint les scénarios possibles et peut devenir très complexe.
Avec les docopt
choses vont beaucoup plus court tout en préservant la lisibilité et en offrant un haut degré de flexibilité. Si vous parvenez à obtenir des arguments analysés à partir du dictionnaire et à effectuer certaines conversions (en entiers, en ouvrant des fichiers ..) manuellement (ou par une autre bibliothèque appelée schema
), vous pouvez trouver la docopt
bonne solution pour l'analyse en ligne de commande.
-x
est universellement un drapeau et facultatif. Coupez le-
si nécessaire.