Le plus souvent moyen de définir un subparser est de fairesubparser argparse sous-entendus par d'autres paramètres
master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
parser = subparsers.add_parser('sub')
parser.add_argument('--subopt')
et la subparser sera appelée avec
command sub --subopt
Je mettre en œuvre un paquet qui appelle un certain nombre de convertisseurs. Si j'utilise l'approche subparser habituelle, je dois faire
convert ext1_to_ext2 file.ext1 file.ext2 --args
qui est à la fois répétitive et sujette aux erreurs car les utilisateurs peuvent appeler
convert ext1_to_ext3 file.ext1 file.ext2 --args
Je préférerais que le subparser est automatiquement déterminée à partir de la analyseur maître afin que les utilisateurs peuvent utiliser la commande
convert file.ext1 file.ext2 EXTRA
et argparse
déterminerait subparser ext1_to_ext2
de file.ext1
et file.ext2
et appeler le sous-registre ext1_to_ext2
pour analyser EXTRA
. Bien sûr, EXTRA
est spécifique au sous-groupe. J'ai essayé d'utiliser des groupes de paramètres pour chaque convertisseur (add_argument_group
) mais les paramètres dans les groupes d'arguments ne peuvent pas se chevaucher et j'ai obtenu une liste désordonnée d'arguments combinés de tous les analyseurs, donc l'utilisation de subparser semble être la bonne solution.
J'ai essayé d'utiliser parse_known_args
avec deux arguments de position, déterminer et utiliser le sous-analyseur approprié pour analyser les arguments restants, mais il est difficile de fournir aux utilisateurs une liste de convertisseurs et leurs arguments du message d'aide.
Existe-t-il un moyen de le faire?
Pourriez-vous utiliser ['parse_known_args'] (https://docs.python.org/3.5/library/argparse.html#partial-parsing)? Cela vous permettrait d'analyser la première partie des arguments, d'évaluer vous-même le subparser approprié, puis de passer les arguments restants au sous-parent approprié. – SethMMorton
C'est l'approche que je prends en ce moment, mais je me bats sur la façon de fournir un message d'aide pour les utilisateurs. Il semble que j'ai besoin de pirater 'convertir fichier.ext1 fichier.ext2 -h' pour imprimer le message d'aide d'un autre analyseur, mais je ne peux toujours pas lister tous les convertisseurs disponibles de' convert -h' (peut-être un 'epilog' pourrait fonctionner). – user2283347
Le type de logique que vous demandez est déraisonnable pour 'argparse'. Soit analyser 'sys.argv' directement ou obtenir les valeurs sous forme de chaînes simples via' argparse', puis en déduire quelle action vous devriez entreprendre. – hpaulj