2017-06-06 2 views
0

Voici le code actuel.Comment utiliser python argparse avec des arguments conditionnellement optionnels?

import time 
import collections 
from modules import outputs 
from modules import scrub 
from modules import lookups 

parser = argparse.ArgumentParser(description='AppMap Converter to Generate Asset Files from AppMapp Data') 
parser.add_argument("operation", nargs='?', default="empty", help='The operation to perform') 
parser.add_argument("input", nargs='?', default="empty", help='The input AppMapp File Path') 
parser.add_argument("output", nargs='?', default="empty", help='The output Asset File Path') 
args = parser.parse_args() 

start = time.time() 

if(args.operation == "Convert"): 
    input_file_path = args.input 
    output_file_path = args.output 
    #DO LOTS OF STUFF 
else: 
    exit() 

Le script est appelé sacsproc, donc je l'exécuter à partir de la ligne de commande comme suit:

./sacsproc Convert input.csv output.csv 

Tout cela fonctionne bien, le problème est que j'ai besoin d'autres commandes de sacsproc qui peuvent avoir un tout ensemble différent de paramètres secondaires. à savoir une commande peut être:

./sacsproc Clean -rts input.csv output.csv err.csv 

Ainsi, je suis en train de déterminer comment on définit des arguments qui sont subordonnées au premier argument? Dans mon esprit, je pense aux utilitaires de ligne de commande zfs qui font ce que j'essaie de faire (par exemple, zpool crée miroir sdb sdc vs zpool remove sda).

Répondre

1

utilisation subparsers

subparsers = parser.add_subparsers(help="sub-command help") 

group1 = subparsers.add_parser("something",help="do something") 
group1.set_defaults(which="g1") # some default value (so you know which group was activated) 
group1.add_argument("ARG",help='do something on ARG') 

group2 = subparsers.add_parser("other",help="do something else") 
group2.set_defaults(which="g2") # give some default value 
group2.add_argument("ARG",help='do something else on ARG') 

ok ...

import argparse 
parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help="sub-command help") 
g1 = subparsers.add_parser("thing1",help="bind to a port and just echo back anything it gets ... with a prompt") 
g1.set_defaults(which="g1") 
g1.add_argument("input",help='the input file') 
g1.add_argument("output",help='the output file') 
g2 = subparsers.add_parser("thing2",help="create a bridge between two ports, this is useful for generating a logfile") 
g2.set_defaults(which="g2") 
g2.add_argument("input",help='thie input file') 
g2.add_argument("output",help='the output file') 
g2.add_argument("error",help="the err file") 


def print_help(args): 
    print "ARGS:",args 
    try: 
     parser.parse_args(args) 
    except: 
     print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n" 

print_help(["-h"]) 
print_help(["thing1","-h"]) 
print_help(["thing2","-h"]) 
+0

Merci, me points dans la bonne direction. Après le test, je pense que cela fonctionne, mais les fichiers d'aide semblent un peu bancal: $ ./sacsproc CombineAppMapp --help utilisation: sacsproc ConvertAppMapp [-h] [entrée] [sortie] – gunslingor

+0

Déplacer les choses autour je reçois (pas ce que j'attends): $ ./sacsproc CombineAppMapp --help utilisation: sacsproc [opération] ConvertAppMapp [-h] [entrée] [sortie] – gunslingor

+0

J'espérais que vous pouviez connecter les points vous-même, mais il y a maintenant un exemple plus complet qui est exactement ce que tu veux je pense ... –