2016-04-25 58 views
0

嗨我想配置幾個只接受特定長參數的子分析器的argparse。下面是密碼使用Python Argparse與幾個子分析器

import argparse 

parser = argparse.ArgumentParser(prog='program', description='Prog Description') 
subparsers = parser.add_subparsers(help='choices') 
parser.add_argument('--choice', '-c', choices=['a', 'apple', 'b', 'banana', 'l', 'lemmon', 'p', 'papaya'], type=str, help='Menu Choices', required=True) 
a_parser = subparsers.add_parser("a") 
b_parser = subparsers.add_parser("b") 
l_parser = subparsers.add_parser("l") 
p_parser = subparsers.add_parser("p") 

a_parser.add_argument("--peel") 
b_parser.add_argument("--peel") 
l_parser.add_argument("--lamount") 
p_parser.add_argument("--pamount",required=True,type=str) 

但我在以下幾點失敗。

  • 子分析器應接受短格式和長格式。恩。 prog -c aprog -c apple都是合法的和相同的
  • 除了--pamount以外不需要subparsers的聲明。但代碼似乎預計他們,因爲我在運行有效模式時遇到錯誤python prog -c a

    用法:program [-h] --choice {a,apple,b,banana,l,lemmon,p,papaya} {A,p,b,L} ... 程序:錯誤:參數太少

我很高興,如果有人能提供給我一些指導方針,以解決這些問題。謝謝!

回答

0

通過使用subparsers您不需要--choice可選。

subparsers = parser.add_subparsers(dest='choice', help='choices') 
# parser.add_argument('--choice', '-c', choices=['a', 'apple', 'b', 'b ... 

指定dest來定義args一個槽,用於子分析器名稱(參見文檔)。

當您使用'python prog -c a',它解析爲a參數-c;但仍需要一個字符串a作爲subparsers的參數(這實際上是一個位置參數)。因此錯誤。 (換句話說,它不是期待--peel說法,它並沒有在解析遠遠得到。)

python prog a 
python prog a --peel 3 

應該工作。

python prog p --pamount 1 

也應該工作(--pamount是必需的)。

要接受'a'和'apple'作爲子分析器名稱,請使用aliases參數(請參閱add_parser的文檔)。

a_parser = subparsers.add_parser("a", aliases=['apple','apples','manzana']) 
+0

感謝您的回答,這對確定方法非常有幫助。然而,這個錯誤仍然存​​在,因爲剛纔我檢查了'aliases'是Python 2.7中的新增功能,並且我正在使用Python 2.6並且必須在該版本中使用它。另外,當我添加'dest ='choice''我不能在參數中添加簡寫形式'c'。 –

+0

你應該可以從任何2.7 python中竊取'argparse.py'文件並放入你自己的目錄。 – hpaulj

+0

是的,我打算做一個類似的事情,因爲當前的argparse模塊版本是1.2.1,我將它升級到1.4.1。這應該可以解決問題。 :) –