2014-08-31 11 views

Odpowiedz

13

Dokumentacja dla subcommands podaje dwa przykłady identyfikacji ciarki.

https://docs.python.org/dev/library/argparse.html#sub-commands

Jednym z nich jest dać add_subparsersdest:

def do_quit(args): 
    # action 
    quit() 

parser = ArgumentParser() 
subparser = parser.add_subparsers(dest='cmd') 
.... 
subparser.add_parser('quit') 
... 
args = parser.parse_args() 
print args.cmd # displays 'quit' 
if args.cmd == 'quit': 
    do_quit(args) 

druga jest użycie set_defaults połączyć subparser z funkcją:

parser = ArgumentParser() 
subparsers = parser.add_subparsers() 
... 
parser_quit = subparsers.add_parser('quit') 
parser_quit.set_defaults(func=do_quit) 
... 
args = parser.parse_args() 
args.func(args) 

Włączone dalsza myśl, Oto sposób, używając niestandardowego Action. To jest jak _HelpAction (który jest używany przez -h). Jest wywoływana przez argument pozycyjny z nargs=0 (lub "?"). Taki argument jest zawsze wywoływany, nawet jeśli nie ma ciągów pasujących do niego (lub raczej 0 pasujących do siebie). Jest to logiczna, ale nieco niejasna konsekwencja sposobu traktowania pozycji.

class QuitAction(argparse.Action): 
    def __call__(self, parser, *args, **kwargs): 
     parser.exit(message="QUITTING\n") 

p=argparse.ArgumentParser() 
sp=p.add_subparsers(dest='cmd') 
p1=sp.add_parser('quit') 
p1.add_argument('foo', action=QuitAction, nargs='?', help=argparse.SUPPRESS) 
p.parse_args(['quit']) 

produkcji (jeśli jest uruchomiony w ipython):

QUITTING 
An exception has occurred, use %tb to see the full traceback.  
SystemExit: 0 
+0

Dzięki! Jeśli spojrzysz na połączony kod: http://stackoverflow.com/questions/25332925/simple-command-line-application-in-python-parse-user-input/25368374#25368374 zobaczysz, że chcę parsowanie odbywa się automatycznie - nie chcę dodawać logiki poza parserem. Żaden inny sposób ? Czy mogę dodać argument "quit" do głównego parsera (bez '-quit')? edit: [github] (https://github.com/Utumno/psync/blob/master/watcher/cli.py) –

+0

Sure - podklasa 'ArgumentParser', która redefiniuje' parse_args'. Najpierw wywołałoby to 'super() .parse_args' (lub' parse_known_args'), a następnie wykonało "logikę poza parserem". Tylko ty wiesz dokładnie, co kryje się za tą definicją metody. – hpaulj

+0

Dodałem metodę, używając opcjonalnego argumentu postionalnego. – hpaulj

Powiązane problemy