J'utilise Argparser pour gérer les arguments de mon prog CLI. Mais avec le temps, je pense que ce n'est pas une bonne idée de l'utiliser. Voici le problème. Je veux utiliser des options sans aucun caractère de préfixe. Comme git commit ou svn move. J'ai cherché un peu et trouvé que Argparse a une méthode add_subparser(). Laissez-nous remplissons notre foo prog:Est-il possible de définir des options sans préfixe dans Argparser?
parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')
subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
nargs='*',
action='store',
help="Add project")
parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
nargs='*',
action='store',
help="Delete project")
args = parser.parser_args()
Maintenant, nous allons exécuter foo avec des options et impression espace de noms args
(je ne l'ai pas passé tout le code, vous obtenez le point):
$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)
Comme vous le voyez, si j'exécute l'option del
, add_project n'est pas passé à la variable args
. Cela provoque des problèmes si j'ai un « si la clause » dans ma fonction principale() comme
def main(args):
if args.delete_project:
...
if args.add_project:
...
Je vais un AttributeError exception, que l'espace de noms n'a pas d'attribut avec le nom add_project si j'exécute ./foo del
. En outre, je ne peux pas passer d'argument aux options del
et add
. J'ai également défini prefix_chars à une chaîne vide, cela n'a pas fonctionné non plus.
Quelle est la façon de le gérer? Argparse est-il capable de créer des options comme git, svn, etc. ou dois-je créer ma propre fonction et gérer tous les arguments moi-même?
C'est absolument le cas.L'OP obtient des erreurs d'attribut sur les sous -parateurs que l'utilisateur n'a pas invoqués, et je lui ai expliqué comment regarder le sous-analyseur utilisé. – Tobu
Bah, mon erreur, j'ai complètement raté le 'subparser'. –
@Nick Heh. C'était un peu laconique, je laisse l'explication. – Tobu