2015-12-01 61 views
1

我有一個關於在Python 2.7中的argparse的問題。我試圖忽略沒有使用的參數,因爲我有一個批處理文件,它將參數傳遞給幾個Python腳本,不同的腳本需要抽出不同的參數。Python argparse忽略串聯參數?

例如:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-a', action='store_true') 

如果我指定自身的每一個參數,它工作正常:

args, unknown = parser.parse_known_args(['-a',' -b']) 
print args 
# Namespace(a=True) 
print unknown 
# [' -b'] 

但是,如果我在級聯格式指定它們:

args, unknown = parser.parse_known_args(['-ab']) 

我得到這個:

: error: argument -a: ignored explicit argument 'b' 

但是,如果我這行添加到上面的代碼:

parser.add_argument('-b', action='store_true') 

然後這個工程:

args, unknown = parser.parse_known_args(['-ab']) 
print args 
# Namespace(a=True, b=True) 
print unknown 
# [] 

所以看起來我可以使用級聯格式僅與已知的參數。我想知道是否有一種方法可以使用連接格式,只需將它知道的參數拉出來即可?我能想到的唯一選擇就是在所有Python腳本中定義所有參數,但是那麼似乎會污染-h幫助顯示?

+0

這是如何工作的。如果你看看這個方法:它叫做'parse_KNOWN_args()'。 –

+0

但是這不是一個爭論 - 實際上只是兩個單獨論證的縮寫版本,a和b,已知和b不是?如果我使用-a -b,那麼即使-b未知,它也可以工作。我只想讓選項使用-ab,因爲許多管理員對這種入門方式更爲熟悉。 –

+0

然後定義參數。 –

回答

2

我以前沒有遇到過這個問題,但我可以想象它爲什麼會發生。但我必須檢查代碼以確定細節。

將'-ab'傳遞給名爲consume_optional的嵌套函數。這有特殊的代碼來識別和吐出這些串聯的參數。它承認'-a'。由於它不需要任何參數,它假定'b'表示'-b'。如果未定義'-b',則會發出此錯誤消息。它不會將其放入extras列表中。

一個獨立的'-b'字符串將被放入extras,但在consume_optionals函數的開始處會發生。您可能會將'-ab'和'-a -b'視爲同一事物,但解析路線不同,導致出現不同的錯誤。

對於'-b'嘗試help=argparse.SUPPRESS。這應該可以減少幫助顯示的「污染」。您可能仍然需要使用自定義的「用法」。

'-ab'在解析器中仍存在問題,其中定義了-b,但'-a'不是。整個字符串將放入'extras'列表中。

+0

太棒了。我將按照此解決方案,我將爲所有可能的參數添加條目,然後對不使用它們的腳本使用help = argparse.SUPPRESS。效果很好。 –