2013-06-12 29 views
27

我一直在尋找這裏和一般的subparser例子的配額,但似乎無法想象這個看似簡單的東西了。如何正確使用argparse子分析器?

我有兩個var類型,其中一個有約束,所以認爲subparser是要走的路。例如-t允許「A」或「B」。如果用戶通過「A」,那麼他們還需要指定它是「a1」還是「a2」。如果他們只是通過「B」,那麼什麼都不是。

我能做到這一點,並有argparse返回我什麼類型的「A」通過或如果它只是「B」?

以下似乎工作,但由於某種原因在子分析後傳遞任何東西時會中斷。

例如從Linux終端

>> python test01.py -t A a1 -v 61 

錯誤與...

usage: test01.py a1 [-h] 
test01.py a1: error: unrecognized arguments: -v 

希望這是有道理的。

代碼:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 

parser.add_argument("-t", 
        choices = ["A", "B"], 
        dest = "type", 
        required=True, 
        action='store', 
        help="Some help blah blah") 

cam_parser = subparsers.add_parser('a1', help='Default') 
cam_parser.set_defaults(which='a1') 

cam_parser = subparsers.add_parser('a2', help='parse this instead of default') 
cam_parser.set_defaults(which='a2') 


parser.add_argument("-v", 
        nargs = '+', 
        required=True, 
        dest = "version", 
        type=int, 
        action='store', 
        help="some version help blah blah") 

argument = parser.parse_args() 

print argument.type 
print argument.version 

回答

26

Subparsers是基於第一位置參數的值調用,所以你的電話看起來像

python test01.py A a1 -v 61 

的「A」觸發相應的子分析器,它將被定義爲允許一個位置參數和-v選項。

因爲​​否則不強加在參數和選項可能出現的次序上的任何限制,並沒有簡單的方法來修改可以出現一次解析已經開始什麼樣的參數/選項(即修改一些涉及到自定義操作解析器實例可能工作),你應該考慮更換-t本身:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 
parser.add_argument("-v", ...) 

a_parser = subparsers.add_parser("A") 
b_parser = subparsers.add_parser("B") 

a_parser.add_argument("something", choices=['a1', 'a2']) 

由於-v針對主分析器定義,它必須被指定之前,指定哪個子分析器用於保持說法參數。

+1

非常感謝你。然而,當我通過-v出於某種原因,即期望-v,並且當我通過它時,我仍然收到錯誤,我得到了我的舊錯誤「無法識別的參數」。即使我在立場爭議之前通過了它。有任何想法嗎?我一直在試圖找到一個類似的例子,但沒有多少運氣。 – user1571144

+0

是'之前的參數,指定哪些子分析器參考輸入參數的用戶代碼或兩者? – Nickpick

+0

它似乎正在執行'group1 = parser.add_subparsers(help ='subparser group 1')'和'group2 = parser.add_subparsers(help ='subparser group 2')'給出錯誤:不能有多個子分析器參數錯誤。我希望用它來分組子命令。 –

相關問題