2012-12-14 66 views
2

假設我有一個簡單的程序,名爲readfile.py,它使用Python的​​支持命令行參數。Python argparse:nargs ='?'和可選參數

程序從位置參數input指定的文件讀取。沒有指定更多的參數,這個程序並不是很令人興奮。它只是input讀取並退出。可選參數--output [OUTPUT_FILE]表示輸入文件應寫入文件。 OUTPUT_FILE也是可選的。如果未指定,則輸入應寫入default.out

設置我的論點解析器是這樣的:

parser = argparse.ArgumentParser(description='Read from a file') 
parser.add_argument(
    'input', 
    help='file to read from') 
parser.add_argument(
    '--output', 
    nargs='?', 
    const='default.out', 
    default=None, 
    help="""write file to %(metavar)s. If %(metavar)s isn't 
     specified, write file to %(const)s.""", 
    metavar='OUTPUT_FILE') 
args = parser.parse_args() 
return args.file, args.output_file 

注意我用default=None因此,如果--ouput沒有在命令行上出現,我能察覺它的缺失與無。

其中給出這樣的用法簽名:

usage: readfile.py [-h] [--output [OUTPUT_FILE]] input 

該處理的參數如預期,如果我跑

python readfile.py input.in --output somefile.out 

python readfile.py --output somefile.out input 

它設置outputdefault.out如果我跑

python readfile.py input.in --output 

,但如果我跑

python readfile.py --output input.in 

它抱怨是有參數太少。我認爲argparse對於解釋這種模式非常「聰明」,將input設置爲input.inoutput設置爲default.out。生成的用法甚至表明了這一點。

我錯過了什麼嗎?

+2

誰低估了這個Q值,至少應該在評論中留下建設性的提示。 – cfi

回答

4

不,它不會識別這個。你在最後一個例子中明確通過input.in--output

我會建議您翻轉defaultconst參數。您希望默認設置爲default.out,因此它應該是default='default.out'。然後可以將const設置爲其他值,以便具有空的--output參數。

這樣,你就不必添加--output參數,除非你想改變默認的,如果你想輸出到stdout例如,你可以使用空--output參數。

+0

在這種情況下(容易混淆?)'default'在'--output'後面沒有參數,'const'用於缺少'--output'參數。 – eidorb

+0

@eidorb:是的,那是倒退。改變它。用它作爲它應該使用的。 –

+0

我必須道歉。我的評論有它回到前面,但我的代碼按照我的意圖。 – eidorb

0

您可以通過「 - 」標記任何選項的結尾。例如:

python readfile.py --output -- input 

具有預期的效果。然而,使參數 - 輸出要求和允許:

python readfile.py --output - input 

可能更乾淨。