2016-01-08 38 views
1

我想創建一個命令解釋mycommand創建子命令,使用​​,有兩個子readwriteread應該只有一個參數,它是一些路徑,write應該有兩個參數其中之一是一條路,另一條是價值。它應該有可能以下列方式來執行命令:Python的argparse - 無標籤

mycommand read <path> 

mycommand write <path> <value> 

不使用標籤的<path><value>參數,即無需--path。我怎樣才能做到這一點?

回答

3

這是相當直截了當以下文檔:

import argparse 

parser = argparse.ArgumentParser() 

subparsers = parser.add_subparsers() 

read = subparsers.add_parser('read') 
read.add_argument('path') 

write = subparsers.add_parser('write') 
write.add_argument('path') 
write.add_argument('value') 

print(parser.parse_args(['read', 'foo'])) 
print(parser.parse_args(['write', 'foo', 'bar'])) 

請注意,這並不是告訴你解析器解析的參數。如果你想,你可以簡單地添加一個destadd_subparsers命令:

subparsers = parser.add_subparsers(dest='subparser') 

最後,您可以添加默認屬性的每個子分析器,你可以用它來執行特定於該子分析器的行動。這是在文檔列明過,但出於完整性,在我們的例子中,它可能是這個樣子:

import argparse 

parser = argparse.ArgumentParser() 

subparsers = parser.add_subparsers(dest='subparser') 

def handle_read(args): 
    print('Handling read') 
    print(args) 
read = subparsers.add_parser('read') 
read.add_argument('path') 
read.set_defaults(handler=handle_read) 

def handle_write(args): 
    print('Handling write') 
    print(args) 
write = subparsers.add_parser('write') 
write.add_argument('path') 
write.add_argument('value') 
write.set_defaults(handler=handle_write) 

args = parser.parse_args() 
args.handler(args) 

我加入了dest到subparsers在這個例子中用於說明目的 - 使用帶處理函數的​​可能會使args上的該屬性過時。