2016-06-15 51 views
3

我正在使用Argparse解析shell輸入到我的Python函數。按位解析argparse輸入

棘手的部分是,該腳本首先讀入一個文件,該文件部分確定Argparse可用的參數類型(它是包含用於指定要輸出的數據的條件的JSON文件)。

但是在將這些參數添加到我的解析器之前,我想閱讀一些與讀取文件相關的參數。 (例如是否修復輸入文件的格式)。有點兒像這樣:

test.py (fix_formatting=True, **more arguments added later) 

當我嘗試運行args = parser.parse_args()兩倍,初始輸入後,加入更多的鍵後,事情土崩瓦解:Argparse相當可預見的抱怨,一些用戶輸入的是unrecognized arguments:。我想我可能會用subparsers來達到目的。

於是,我的變化(以下在docs是最好的,我可以的例子):

def main(): 
    parser = argparse.ArgumentParser() 
    subparsers = parser.add_subparsers(help='sub-command help') 
    settingsparser = subparsers.add_parser('settings') #i want a subparser called 'settings' 
    settingsparser.add_argument('--fix_formatting', action='store_true') #this subparser shall have a --fix_formatting 

然後,我只嘗試解析「設置」部分,像這樣:

settings=parser.parse_args(['settings']) 

這似乎工作。但後來我加我的其他按鍵,事情打破:

keys=['alpha','beta','gamma','delta'] 
    for key in keys: 
     parser.add_argument("--"+key, type=str, help="X") 
    args = parser.parse_args() 

如果我解析任何從鍵參數中的任何輸入,Argparse抱怨我做的invalid choice: [...] (choose from 'settings')。現在我不明白爲什麼我必須從「設置」中進行選擇;該文件說,該分析

將只包含這是通過在命令行中選擇(而不是任何其他subparsers)主分析器和子分析器屬性

  • 什麼是我的錯誤在這裏瞭解?

  • 如果這是錯誤的方法,如何解決一位輸入之前的另一位呢?

任何幫助非常感謝!

回答

3

parse_args來電parse_known_args。這將返回args名稱解析以及無法處理的字符串列表(從sys.argv)(extras)。如果此列表不爲空,則parse_args會引發此錯誤。

https://docs.python.org/3/library/argparse.html#partial-parsing

因此,如果要分析一些輸入的parse_known_args是有用的。

sys.argv保持不變。隨後調用解析器(無論是否是原始解析器)再次使用該解析器,除非您通過extras

我不認爲subparsers在這裏幫助你。它們不適用於延遲或兩階段解析。我建議首先使用子分析器的文檔示例。


到主分析器中,subparsers樣子

subparsers = parser.add_argument('cmd', choices=['select',...]) 

換句話說,它增加了在choices是你定義的子分析器名稱的位置參數。這可能會幫助你明白爲什麼它期望你命名爲select。定位通常是必需的。

(這是近期版本中的一個例外,https://stackoverflow.com/a/22994500/901925

+0

非常感謝!我想我完全誤解了subparsers的概念以及部分解析。感謝澄清... – patrick