我正在使用Python 2.7,並試圖使用argparse完成類似shell的行爲。 我的問題,一般來說,我似乎無法在Python 2.7中找到一種方法來使用argparse的子分析器作爲可選項。 這是很難解釋我的問題,所以我會描述我的程序需要什麼。如何使用Argparse模塊與Python 2.7設置默認的Subparser
該方案有2種模式工作:
- 與給定的命令啓動程序(每個命令都有它自己的 附加參數)和其他參數將運行一個特定 任務。
- 不使用命令啓動程序會啓動一個類似shell的程序,它可以接收一行參數並對它們進行處理,就好像程序是使用給定行調用的參數一樣。
因此,例如,如果我的程序支持 'CMD1' 和 'CMD2' 的命令,我可以用它像這樣:
python program.py cmd1 additional_args1
python program.py cmd2 additional_args2
或殼模式:
python program.py
cmd1 additional_args1
cmd2 additional_args2
quit
另外,我也希望我的程序能夠利用可選的全局參數,將影響所有命令。
對於我正在使用argparse像這樣(這是一個純粹的例子):
parser = argparse.ArgumentParser(description="{} - Version {}".format(PROGRAM_NAME, PROGRAM_VERSION))
parser.add_argument("-i", "--info", help="Display more information")
subparsers = parser.add_subparsers()
parserCmd1 = subparsers.add_parser("cmd1", help="First Command")
parserCmd1.set_defaults(func=cmd1)
parserCmd2 = subparsers.add_parser("cmd2", help="Second Command")
parserCmd2.add_argument("-o", "--output", help="Redirect Output")
parserCmd2.set_defaults(func=cmd2)
所以我可以調用CMD1(沒有額外的參數)或CMD2(帶或不帶-o標志)。而且我可以添加標誌-i來顯示被調用命令的更多信息。
我的問題是,我無法激活shell模式,因爲我必須提供CMD1或CMD2作爲參數
限制(因爲使用它是強制性的subparsers的):
- 我不能使用Python 3(我知道在那裏可以很容易地完成)
- 由於全局可選參數,我無法檢查是否沒有參數來跳過arg解析。
- 我不想增加一個新的命令調用外殼,在所有
所以不提供命令時,我怎樣才能實現這種行爲與argparse和Python 2.7它必須是?
只是一個快速的音符 - 事實上,subparsers是可選的是一個錯誤。他們曾經被要求(作爲一個正常的位置),但在幾年前一個不相關的變化,subparsers通過裂縫跌倒。我將不得不更詳細地研究您的問題,以瞭解爲什麼您認爲Py2和Py3在這方面存在差異。 – hpaulj