2014-08-31 26 views

回答

13

subcommands的文檔給出瞭如何識別子分析器的兩個示例。

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

一個是給add_subparsers一個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) 

另一種是使用set_defaults給子分析器與函數鏈接:

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) 

在進一步思考,這是一種方法,使用自定義Action。它就像_HelpAction(由-h使用)。它的位置參數是nargs=0(或'?')。這樣的參數總是被調用,即使沒有字符串匹配它(或者說,0個字符串匹配它)。這是一個合理的,但有點模糊的結果,如何處理定位。

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

生產(當IPython中運行):

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

謝謝!如果你看看鏈接的代碼:http://stackoverflow.com/questions/25332925/simple-command-line-application-in-python-parse-user-input/25368374#25368374你會看到我想要的解析自動發生 - 我不想在解析器外部添加邏輯。別無退路 ?我可以爲主分析器添加一個「退出」參數嗎(不是'-quit')?編輯:[github](https://github.com/Utumno/psync/blob/master/watcher/cli.py) – 2014-08-31 21:43:19

+0

當然 - 重新定義'parse_args'的'ArgumentParser'子類。它會首先調用'super()。parse_args'(或'parse_known_args'),然後執行'解析器之外的邏輯'。只有你確切知道隱藏在方法定義後面的是什麼。 – hpaulj 2014-08-31 22:41:44

+0

我添加了一個使用可選postional參數的方法。 – hpaulj 2014-09-01 00:41:50

相關問題