2017-03-09 148 views
1

我有這樣的代碼解析的命令行參數字符選項中的錯誤(?):的Python argparse與單參數

def handleCmdLineArgs(self): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-j','--juice', help='juice', default="") 
    parser.add_argument('-bx','--box', help='box', default="") 
    args,unknown = parser.parse_known_args() 

當我運行與其中j argparse開始-j後的參數命令行

舉例:: program.py -j橙-jungle

argparse將返回args.juice =「ungle」,而不是所希望的「橙色的參數argparse將與字的其餘部分取代-j參數「

我已經創建了一個解決方法,但我很好奇,如果其他人已經看到這個或知道它發生的原因?或者這可能是一個錯誤,在argparse?

回答

3

這是預期的行爲。對於單點劃線選項,該空間是可選的。所以這兩者是等價的:

program.py -jorange 
program.py -j orange 

查看文檔的Option value syntax section

對於短選項(只有一個字符長),期權,其價值可以級聯:

>>> parser.parse_args(['-xX']) 
Namespace(foo=None, x='X') 

如果要通過orange -jungle作爲值,則需要在命令行上使用引號:

program.py -j "orange -jungle" 

如果你想在恰好開始一個-的其它位置參數來傳遞,使用--信號選項標誌的結尾:

program.py -j orange -- -jungle 

Arguments containing - section

如果你有位置參數,必須以-開頭,看起來不像負數,你可以插入僞參數'--',它告訴小號parse_args(),經過這一切都是一個位置參數:

>>> parser.parse_args(['--', '-f']) 
Namespace(foo='-f', one=None) 
+0

我不想橙色-jungle傳遞的價值,我想在橙爲-j的值傳遞,我想 - 叢林最終以未知數 – Ken

+0

@肯:這不是一個可用的選項。命令行應該接受一個選項或者如果不行的話會引發錯誤。你也許可以嘗試[部分解析](https://docs.python.org/3/library/argparse.html#partial-parsing)來實現處理「未知」選項,但對於任何以已知單 - 特徵短選項,你必須接受argparse會將其視爲選項 - 值對。 –

+0

@ Martijn Pieters,這正是我正在做的。注意下面這行:args,unknown = parser.parse_known_args() – Ken