2011-08-15 19 views
11

下面是一個例子代碼:在python中,如何讓子分析器讀取父解析器的參數?

import argparse 

parser=argparse.ArgumentParser() 
parser.add_argument('-main_arg') 
subparser=parser.add_subparser() 
a=subparser.add_parser('run') 
a.add_argument('required_sub_arg') 
a.add_argument('arg_a') 
b=subparser.add_parser('b') 
parser.parse_args() 

我想,如果我進入program run required_sub_arg -main_arg -arg_a

現在它在-main_arg閱讀,它不承認-main_arg作爲有效參數。

+0

main-arg是爲主分析器還是子分析器提供參數? – katrielalex

+0

main-arg是可以在任何子分析器中使用的參數 –

回答

8

服務信息最近讀者

由於這個問題仍然有在2016年訪問,做任何事情這個複雜與argparse之前,請考慮使用docopt代替。它會提高你的理智和任何可能讀取或修改你的代碼的人的理智。謝謝。

原始答覆

因爲你有幾個問題。

首先,parser.parse_args是返回parser的論點命名空間的方法,所以你應該做的像

args = parser.parse_args() 

然後args.main_args東西從呼叫得到-main_arg

program -main_arg run required_sub_arg -arg_a 

您的問題main_arg是您創建了一個參數parser nam編main_arg,你作出這樣

program run required_sub_arg -main_arg -arg_a 

打電話說,指的是參數a命名main_arg。由於a沒有這種說法,因此無效。

爲了從其子分析器之一引用解析器的參數,必須使所述子分析器繼承其父級的參數。這是用

a=parser.add_subparser('run', parents=[parser]) 

你錯誤的子分析器的子解析器。有關更多信息,請參閱http://docs.python.org/dev/py3k/library/argparse.htmlhttps://code.google.com/p/argparse/issues/detail?id=54

+0

上面提到的運行代碼會返回一個錯誤,並說-main_arg不是有效的參數。 那麼我需要'父母= [解析器]'嗎? 我可以這樣做,程序-main_arg運行required_sub_arg -arg_a但不能,程序運行required_sub_arg -main_arg -arg_a –

+0

我編輯了答案,使問題更加明顯。 – Evpok

+0

那麼,add_subparser所做的基本上就是創建一個新的ArgumentParser。當parse_arg被調用時,它會解析subparser和原始解析器的參數嗎? 如果同時調用2個子命令會怎麼樣? –