Cette réponse vient de Steven Bethard sur les groupes Google . Je le redistribue ici pour faciliter l'accès aux personnes sans compte Google.
Vous pouvez remplacer le comportement par défaut de la error
méthode:
import argparse
import sys
class MyParser(argparse.ArgumentParser):
def error(self, message):
sys.stderr.write('error: %s\n' % message)
self.print_help()
sys.exit(2)
parser = MyParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()
Notez que la solution ci-dessus imprimera le message d'aide chaque fois que la error
méthode est déclenchée. Par exemple, test.py --blah
imprimera également le message d'aide s'il --blah
ne s'agit pas d'une option valide.
Si vous souhaitez imprimer le message d'aide uniquement si aucun argument n'est fourni sur la ligne de commande, alors c'est peut-être toujours le moyen le plus simple:
import argparse
import sys
parser=argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
if len(sys.argv)==1:
parser.print_help(sys.stderr)
sys.exit(1)
args=parser.parse_args()
Notez que parser.print_help()
s'imprime sur stdout par défaut. Comme le suggère init_js , utilisez parser.print_help(sys.stderr)
pour imprimer sur stderr.
parser.print_usage()
à la place deparser.print_help()
- le message d'aide inclut l'utilisation, mais il est plus détaillé.error()
me semble une idée terrible. Il sert un but différent, il n'est pas conçu pour imprimer une utilisation conviviale ou une aide.Au lieu d'écrire une classe, un try / except peut être utilisé à la place
L'avantage est que le flux de travail est plus clair et que vous n'avez pas besoin d'une classe de stub. L'inconvénient est que la première ligne «d'utilisation» est imprimée deux fois.
Cela nécessitera au moins un argument obligatoire. Sans arguments obligatoires, fournir zéro argument sur la ligne de commande est valide.
la source
-h
indicateur est utilisé et les impressions inutiles aident si l'--version
indicateur est utilisé. Pour atténuer ces problèmes, vous pouvez vérifier le type d'erreur comme ceci:except SystemExit as err: if err.code == 2: parser.print_help()
Avec argparse, vous pourriez faire:
la source
parser.parse_args()
Si vous avez des arguments qui doivent être spécifiés pour que le script s'exécute - utilisez le paramètre requis pour ArgumentParser comme indiqué ci-dessous: -
parse_args () signalera une erreur si le script est exécuté sans aucun argument.
la source
Si vous associez des fonctions par défaut aux (sous) analyseurs, comme cela est mentionné ci-dessous
add_subparsers
, vous pouvez simplement l'ajouter comme action par défaut:Ajoutez le try-except si vous déclenchez des exceptions en raison d'arguments de position manquants.
la source
La solution la plus propre sera de passer manuellement l'argument par défaut si aucun n'a été donné sur la ligne de commande:
Exemple complet:
Cela affichera une aide complète (pas une courte utilisation) si elle est appelée sans arguments.
la source
sys.argv[1:]
est un idiome très courant. Je voisparser.parse_args(None if sys.argv[1:] else ['-h'])
plus idiomatique et plus propre.Jeter ma version dans la pile ici:
Vous pouvez remarquer le
parser.exit
- je le fais principalement comme ça car il enregistre une ligne d'importation si c'était la seule raisonsys
dans le fichier ...la source
not vars(args)
peut ne pas fonctionner lorsque les arguments ont unedefault
méthode.Il y a une paire de doublures avec
sys.argv[1:]
(un idiome Python très courant pour référencer les arguments de la ligne de commande, étantsys.argv[0]
le nom du script) qui peuvent faire le travail.Le premier est explicite, propre et pythonique:
Le second est un peu plus hacké. Combiner le fait précédemment évalué qu'une liste vide est
False
avec leTrue == 1
etFalse == 0
équivalences vous obtenez ceci:Peut-être trop de crochets, mais assez clair si une sélection d'argument précédente a été faite.
la source
La
parser.exit
méthode accepte également unstatus
(code retour) et unmessage
valeur (incluez vous-même une nouvelle ligne de fin!).un exemple d'opinion, :)
Exemples d'appels:
la source
Définissez vos arguments positionnels avec des nargs et vérifiez si les arguments positionnels sont vides.
Référence Nargs Python
la source
Voici une autre façon de le faire, si vous avez besoin de quelque chose de flexible où vous souhaitez afficher l'aide si des paramètres spécifiques sont passés, aucun du tout ou plus d'un argument conflictuel:
À votre santé!
la source
Si votre commande est quelque chose où un utilisateur doit choisir une action, utilisez un groupe mutuellement exclusif avec required = True .
C'est une sorte d'extension à la réponse donnée par pd321.
Production:
Cela ne donne que l'aide de base. Et certaines des autres réponses vous apporteront toute l'aide. Mais au moins, vos utilisateurs savent qu'ils peuvent faire -h
la source
Ce n'est pas bon (aussi, car intercepte toutes les erreurs), mais:
Voici la définition de la
error
fonction de laArgumentParser
classe:https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Comme vous le voyez, après la signature, il faut deux arguments. Cependant, les fonctions en dehors de la classe ne connaissent pas le premier argument:
self
car, en gros, c'est un paramètre pour la classe. (Je sais que tu sais ...) De ce fait, juste passer propreself
etmessage
en_error(...)
ne peut pas (affichera:
). Vous pouvez passer
parser
(self
) en_error
fonction, en l'appelant:, mais vous ne voulez pas quitter le programme pour le moment. Puis retournez-le:
. Néanmoins,
parser
ne sait pas, qu'il a été modifié, donc quand une erreur se produit, il en enverra la cause (à propos, sa traduction localisée). Eh bien, interceptez-le:. Maintenant, quand une erreur se produit et
parser
enverra la cause de celle-ci, vous l'intercepterez, la regarderez et ... la jeterez.la source