2014-08-31 33 views

cevap

13

subcommands belgelerine, altparser tanımlamak için iki örnek verir.

Bir

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

vermektir add_subparsers bir dest:

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) 

diğer bir fonksiyonu olan subparser bağlamak için set_defaults kullanmaktır:

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) 

Açık daha fazla düşündüm, İşte özel bir Action kullanarak bir yol. _HelpAction (-h tarafından kullanılan) gibidir. nargs=0 (veya '?') Ile konumsal argüman olarak adlandırılır. Böyle bir argüman her zaman çağrılır, buna uygun dizeler olmamasına rağmen (ya da 0 dizgiler eşleşir). Bu, pozisyonların nasıl ele alındığının mantıklı, ama biraz belirsiz bir sonucudur. (Ipython çalıştırmak)

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']) 

üreten:

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

teşekkürler! Bağlantılı bir koda bakarsanız: http://stackoverflow.com/questions/25332925/simple-command-line-application-in-python-parse-user-input/25368374#25368374 otomatik olarak ayrıştırma - ayrıştırıcı dışında mantık eklemek istemiyorum. Başka yol yok ? Ana ayrıştırıcıya "bırakma" argümanı ekleyebilir miyim (''quit' olanı değil)? edit: [github] (https://github.com/Utumno/psync/blob/master/watcher/cli.py) –

+0

Elbette - "parse_args" öğesini yeniden tanımlayan bir "ArgumentParser" alt sınıfı. İlk önce super(). Parse_args' (veya 'parse_known_args') olarak adlandırılır ve sonra 'ayrıştırıcının dışındaki mantığı' gerçekleştirir. Sadece bu yöntem tanımının ardında gizlenmiş olanı tam olarak bilirsiniz. – hpaulj

+0

İsteğe bağlı bir bağımsız değişken kullanarak bir yöntem ekledim. – hpaulj

İlgili konular