2017-07-19 3 views
0

J'ai quelques arguments positionnels et optionnels (en utilisant argparser), maintenant besoin d'ajouter un drapeau qui ne prend aucun argument/valeur et appelle essentiellement une méthode.Drapeau Argparser sans argument avec précédence

disons que ceci est l'analyseur actuel:

./run.py arg1 arg2 -i input 

est ici le code bref exemple

parser.add_argument("arg1", 
        help="arg1 handler") 
parser.add_argument("arg2", 
        help="arg2 handler") 
parser.add_argument('-i', dest='input_handler', 
        help="input handler") 

ce que je suis à la recherche est quelque chose de similaire lorsque vous utilisez --help qui aboutit à montrer l'aide (et a priorité sur les autres indicateurs). Je veux donc prendre en charge un drapeau spécial (comme --help) sans me soucier de fournir tous les autres drapeaux dans la ligne de commande.

donc quelque chose comme ça devrait fonctionner également:

./run.py --list 

Je pensais à utiliser 'store_true' de prendre le drapeau sans valeur, mais il n'a pas la priorité sur les autres drapeaux.

des commentaires/suggestions est vraiment apprécié

+0

Peut être utile si vous avez également partagé du code.Cela pourrait aider les gens à comprendre exactement ce que vous essayez d'accomplir. – Grimmy

+0

Pourquoi avez-vous besoin de la précédence? Vous pouvez analyser vos arguments et vérifier si '--list' est présent avant d'agir sur vos autres arguments. – zwer

+0

Je veux './run.py --list' pour fonctionner. Similaire à './run --help' qui ne nécessite aucun autre drapeau/argument. Si je ne fournis pas tous les autres arguments, argparser se plaint d'arguments manquants. – Mahyar

Répondre

0

Vous pouvez utiliser soemthing comme ceci:

parser = argparse.ArgumentParser() 
parser.add_argument('--list',action='store_true',help='perform some task') 
parser.add_argument('--input',type=str, required=False, help='input variable') 

args = parser.parse_args() 

if args.list: 
    perform_function() 
elif args.input is not None: 
    function(args.input) 
... 
0

Vous êtes absent le champ nargs.

#!/usr/bin/env python 
"""Runs using two args and an option input 

Usage: ./run.py arg1 arg2 -i input 

Arguments: 
    arg1/arg2: any order 

Options: 
    -i input 
""" 
import argparse 

parser = argparse.ArgumentParser(usage=__doc__) 
parser.add_argument("pos_args", help="Unknown pos args sequence", nargs=2) # '+' for any number of args 
parser.add_argument('-i', dest='input_handler', help="input handler") 

args = parser.parse_args() 

arg1, arg2 = args.pos_args 
+0

Avez-vous réellement essayé cela? 'nargs =" 2 "' soulève probablement une sorte d'erreur, que ce soit lors de la création, de l'analyse ou de l'affichage d'une aide. – hpaulj

+0

Correction: n'utilisez pas de guillemets dans les zones où il attend un entier. –

0

-h L'aide est prioritaire car elle force sys.exit lorsqu'elle est rencontrée. C'est-à-dire qu'il a une classe Action qui imprime l'aide puis se termine.

Il existe une classe d'action version qui fait quelque chose de similaire - afficher un message et quitter.

Toutes les autres actions stockent quelque chose dans l'espace de noms args et poursuivent l'analyse. La plainte missing arguments est produite à la fin de l'analyse lorsqu'elle en déduit que certains arguments positionnels (ou autres requis) n'ont pas été remplis.

je peux penser à plusieurs solutions:

  • définissent une nouvelle sous-classe d'action sur le modèle help ou version. Si vous prenez cette route, vous devriez faire le développement, donc vous savez exactement ce qui se passe.

  • changez vos positionnels en quelque chose de facultatif. nargs='?' est une possibilité, mais marquer est mieux. Dans ce cas input_handler pourrait être une action simple store_true.

  • utilisez les sous-fichiers. input_handler serait analyseur qui ne prend aucun argument. L'autre subparser prendrait les 2 positions. Regardez la documentation des sous-parties et la note set_defaults.