2016-12-28 46 views
1

我正在爲各種子分析器編寫一個Python模塊的參數分析器。我的目標是有一個分享的內容,其參數的構造函數傳遞給多個孩子一個說法:Python argparse:獲取幫助字符串中的子分析器程序的名稱

from argparse import ArgumentParser 
parser = ArgumentParser(prog = 'master') 
parser1 = ArgumentParser(help = None) 
parser1.add_argument('foo', type = int, help = 'Number of times to process %(prog)s') # Line of interest 
parser2 = ArgumentParser(help = None) 
parser2.add_argument('--bar', type = int, default = 0, help = 'Start at this number') 
parser3 = ArgumentParser(help = None) 
parser3.add_argument('--baz', type = str, default = 'DEFAULT', help = 'Init file with this text') 
subparsers = parser.add_subparsers() 
sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2]) 
sp2 = subparsers.add_parser('prog2', parents = [parser1, parser3]) 
parser.parse_args('prog1 -h'.split()) 

所需的輸出會是這樣的

usage: master prog1 [-h] [--bar BAR] foo 

positional arguments: 
    foo   Number of times to process prog1 

optional arguments: 
    -h, --help  show this message and exit 
    --bar   Start at this number 

當我使用這個確切的設置,我得到master prog1代替的幫助字符串中的prog1。我應該在標記爲#Line of interest的行中更改哪些內容以獲得理想的結果?

回答

0

這不是對您的問題的直接回答,但我會使用Click_作爲您正在嘗試執行的操作。

Click_在三點:

  1. 命令的任意嵌套
  2. 自動幫助頁面生成
  3. 支持在運行時
0

我可以解釋是怎麼回事子的延遲加載,但可能無法提供解決方案。

簡短的回答是,sp1.progusage格式中被用作幫助行中的%(prog)s值。它的設計與usage一致。

===============

sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2]) 

創建一個解析器,並從parents增加了論據。 add_parserclass _SubParsersAction(subparser Action類)的一種方法。而對於解析器prog屬性與創建:

 if kwargs.get('prog') is None: 
     kwargs['prog'] = '%s %s' % (self._prog_prefix, name) 

你應該能夠看到print(sp1.prog)這個屬性(我想到「主PROG1」)。這是在usage行中以及在%(prog)s的任何幫助行中使用的值。

subparsers._prog_prefix源自parser.prog(詳見add_subparsers代碼)。但你也可以指定一個prog參數:

sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2], prog='prog1') 

這應該糾正help行的字符串。但它也會改變字符串usage

你也可以給子分析器明確usage

sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2], prog='prog1', usage='master prog1 ...') 

沒有做手術的HelpFormatter我不認爲你可以更改輔助線prog沒有使用也改變它。

並給出parents作品的方式,您不能更改prog1 foo的幫助熱線,也不會將其更改爲prog2 fooparents通過引用複製操作對象,因此這兩個子分析器共享foo操作對象。

你很多人不得不放棄parents的方法,至少對於這個參數,並硬編碼的名稱。如果您需要將參數添加到多個子分析器中,請編寫一個小實用程序函數以實現該功能。 parents機制只是(通常)一種便利,可以節省一些打字/編輯。

===================

這個修改後的腳本將說明我的觀點

parser = ArgumentParser(prog = 'master') 

parser1 = ArgumentParser(add_help = False) 
fooarg=parser1.add_argument('foo', type = int, help = 'foo prog: %(prog)s') # Line of interest 
parser2 = ArgumentParser(add_help = False) 
parser2.add_argument('--bar', type = int, default = 0, help = 'Start at this number') 
parser3 = ArgumentParser(add_help = False) 
parser3.add_argument('--baz', type = str, default = 'DEFAULT', help = 'Init file with this text') 

subparsers = parser.add_subparsers(prog='subparsers') 
sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2], prog='name1') 
sp2 = subparsers.add_parser('prog2', parents = [parser1, parser3]) 

#parser.print_help() 

# fooarg is an Action for both subparsers 
# print(fooarg.help) 
# fooarg.help = 'FOO HELP' 

print('==>sp1 prog:', sp1.prog) 
sp1.print_help() 
print('==>sp2 prog:', sp2.prog) 
sp2.print_help() 

sp1.prog = 'custom' 
sp1.print_help() 

# addition 
fooarg.default = 'default' 
fooarg.metavar = 'META' 
fooarg.help = 'prog: %(prog)s, dest=%(dest)s, nargs=%(nargs)s, type=%(type)s, default=%(default)s' 
sp1.print_help() 

這最後位增加了大量動作的屬性幫助。但是prog是唯一來自parser

positional arguments: 
    META  prog: custom, dest=foo, nargs=None, type=int, default=default