2016-03-04 26 views
1

我有一個腳本,裏面有一長串可選參數,其中最近添加了通過文件傳遞參數的選項。代碼如下:我首先添加from_file參數,然後parse_known_args。除了-h標誌以外,一切正常。調用此標誌時的輸出僅指調用parse_known_args之前添加的參數。ArgumentParser -h在parse_known_args之後沒有打印選項

問題:如何獲得幫助選項以識別parse_known_args調用之後的所有參數?

optional arguments: 
-h, --help   show this help message and exit 

Meta Variables: 
--to_file [TOINITFILE] 
        write flag values to text file (default: None) 
--from_file FROMINITFILE 
        reads flag values from file (default:) 

編輯:增加了一些細節(如意見建議),以我的代碼,爲什麼我打電話parse_known_args

    使用 -h標誌時

    # grab values from file_parser or default 
    def getInitVar(variable, parser, default, varList=False): 
        if parser: 
         if varList: 
          return [o.strip() for o in parser.get('constants',variable).split(",")] if parser.has_option('constants',variable) else default 
         else: 
          return parser.get('constants',variable) if parser.has_option('constants',variable) else default 
        else: 
         return default 
    
    # first parser for to/from file parameters 
    parser = argparse.ArgumentParser(
        description='', prefix_chars='-+', formatter_class=argparse.ArgumentDefaultsHelpFormatter) 
    
    # Meta variables 
    group = parser.add_argument_group('Meta Variables', '') 
    group.add_argument('--to_file', dest='toinitfile', nargs='?', const=DEF_INIT_FILE, default=None, 
            help='write flag values to text file') 
    group.add_argument('--from_file', type=str, dest='frominitfile', default='', 
            help='reads flag values from file') 
    
    args, remaining_argv = parser.parse_known_args() 
    
    # create second parser for reading from files 
    if args.frominitfile: 
        conf_parser = SafeConfigParser() 
        conf_parser.read(args.frominitfile) 
    else: 
        conf_parser = None 
    
    group = parser.add_argument_group('Some Group', 'blah blah') 
    
    group.add_argument('-someFlag', dest='somevar', default=getInitVar('corpdb', conf_parser, DEF_VAR), 
            help='Some help.') 
    .... 
    

    輸出

  1. 我創建解析器並添加兩個參數:from_fileto_file
  2. 解析參數。如果from_file存在,我創建第二個解析器並讀取輸入變量。
  3. 繼續向解析器添加參數。默認值是我傳遞第二個解析器和默認值的函數。

編輯:最後搞清楚如何做到這一點,公佈下面的答案。

+0

選項只有當你調用'parse_args'或'parse_known_args'處理。當然,在這之後你不會看到任何添加的參數......當你解析命令行時,它們不存在! – larsks

+0

@larsks你有什麼建議如何解決這個問題? – Sal

+0

直到完全配置好ArgumentParser之後才調用任何'parse'函數。 – larsks

回答

1

進行了如下修改:

  1. 創建一個init_parser與參數add_help=False
  2. 傳遞init_parserparser作爲父:parents=[init_parser]
  3. 移動的描述參數從init_parserparser

這是最終的代碼:

init_parser = argparse.ArgumentParser(prefix_chars='-+', formatter_class=argparse.ArgumentDefaultsHelpFormatter, add_help=False) 

# Meta variables 
group = init_parser.add_argument_group('Meta Variables', '') 
group.add_argument('--to_file', dest='toinitfile', nargs='?', const=DEF_INIT_FILE, default=None, help='write flag values to text file') 
group.add_argument('--from_file', type=str, dest='frominitfile', default='', help='reads flag values from file') 

args, remaining_argv = init_parser.parse_known_args() 

if args.frominitfile: 
    conf_parser = SafeConfigParser() 
    conf_parser.read(args.frominitfile) 
else: 
    conf_parser = None 

# Inherit options from init_parser 
parser = argparse.ArgumentParser(description='Extract and Manage Language Feature Data.', 
    parents=[init_parser]) 

group = parser.add_argument_group('Some Group', 'blah blah') 

group.add_argument('-someFlag', dest='somevar', default=getInitVar('corpdb', conf_parser, DEF_VAR), 
        help='Some help.') 
.... 

輸出:

optional arguments: 
    -h, --help   show this help message and exit 

Meta Variables: 
--to_file [TOINITFILE] 
       write flag values to text file (default: None) 
--from_file FROMINITFILE 
       reads flag values from file (default:) 
Some group: 
    blah blah blah 
--someFlag 
... 
+0

這是我見過的「父母」更好的用法之一。 – hpaulj

0

它看起來像你解析輸入,並根據某些值,添加更多的參數,你會再次解析。對?

-h正在由第一個解析處理。記住它在打印其參數後退出。所以它沒有得到some group的補充,更不用說顯示後面的幫助。

解決此問題的一個方法是使用add_help=False定義第一個解析器,因此第一個parse_know_args不處理-h

現在將您自己的-h參數添加到解析器(嘗試action='help');或重新創建解析器。無論哪種方式,第二個解析步驟將在-h上執行。

相關問題