我需要實現一個命令行界面,其中程序接受子命令。如何使用argparse處理CLI子命令
例如,如果該計劃被稱爲「富」,在CLI看起來像
foo cmd1 <cmd1-options>
foo cmd2
foo cmd3 <cmd3-options>
cmd1
和cmd3
必須與他們的選擇至少一個和三個cmd*
參數總是獨佔使用。
我想在argparse中使用subparsers,但暫時沒有成功。問題出在cmd2
,沒有參數:
如果我嘗試添加沒有參數的子分析器條目,parse_args
返回的名稱空間將不包含任何告訴我該選項被選中的信息(請參見下面的示例) 。 如果我嘗試將cmd2
作爲參數添加到parser
(而不是子分析器),那麼argparse會認爲cmd2
參數後面會有任何子分析器參數。
有沒有簡單的方法來實現這一點?使用情況應該是很常見......
這裏如下是我迄今試圖更接近我所需要的:
所有subparsers的parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='Functions')
parser_1 = subparsers.add_parser('cmd1', help='...')
parser_1.add_argument('cmd1_option1', type=str, help='...')
parser_2 = subparsers.add_parser(cmd2, help='...')
parser_3 = subparsers.add_parser('cmd3', help='...')
parser_3.add_argument('cmd3_options', type=int, help='...')
args = parser.parse_args()
我對'永不插入'問題。簡單地給'add_subparsers'一個'dest'。 – hpaulj 2014-10-06 23:05:20
@hpaulj你是對的。但是,我個人從未使用過。正如我所說的,對不同的子分析器使用不同的處理函數有更多的命令,所以使用'set_defaults'是更好的解決方案。只適用於想要使用'dest'參數的最簡單情況。 – Bakuriu 2014-10-07 10:37:43