2015-05-03 47 views
0

我使用這個lib中的python解析參數位置參數:https://docs.python.org/2/library/argparse.html管理多個在與argparse

到目前爲止,我有這樣的:

prog arg1 [-s arg2 [arg2 ...]] [-m arg3 [arg3 ...]] 

而且我想這一點:

prog arg1 -s arg2 [arg2 ...] -m arg3 [arg3 ...] 

這是我的蟒蛇碼:

parser = argparse.ArgumentParser() 
parser.add_argument('path', type=str, 
        help="path used for the generation of the rouge files") 
parser.add_argument('-s', '--systems', type=str, nargs='+', 
        help="path to the systems generated summary files") 
parser.add_argument('-m', '--models', type=str, nargs='+', 
        help="path to the reference summary files") 
args = parser.parse_args() 
print args 

問題是當您調用沒有可選參數的程序時,它不會給出錯誤(參數太少)。我希望我的可選參數是必須的,但是當你進行下面的調用,解析器不弄清楚哪種args來參與...

對於用下面的代碼爲例:

parser = argparse.ArgumentParser() 
parser.add_argument('arg1', type=str, nargs='+') 
parser.add_argument('arg2', type=str, nargs='+') 
parser.add_argument('arg3', type=str, nargs='+') 
args = parser.parse_args() 

而下面的調用:

python test.py arg1 arg1 arg1 arg2 arg2 arg3 arg3 

我得到這個:

Namespace(arg1=['arg1', 'arg1', 'arg1', 'arg2', 'arg2'], arg2=['arg3'], arg3=['arg3']) 

可以肯定她e是這種前衛的格式:

prog arg1 [arg1 ...] arg2 [arg2 ...] arg3 

感謝您的幫助:)

+0

什麼是你的問題?這段代碼是否工作? –

+0

此代碼有效,但參數是可選的。我不知道如何讓他們成爲一種義務。 – Cadene

+0

你是什麼意思的「種強制性」。 'nargs ='+''參數已經被需要。 –

回答

2

optionals可以採取required=True參數。這可能是你需要的一切。

p=argparse.ArgumentParser() 
p.add_argument('-m',nargs='+',required=True) 
p.add_argument('-n',nargs='+',required=True) 
p.print_usage() 

生產

usage: ipython3 [-h] -m M [M ...] -n N [N ...] 

至於爲什麼:

Namespace(arg1=['arg1', 'arg1', 'arg1', 'arg2', 'arg2'], arg2=['arg3'], arg3=['arg3']) 

您指定每個arg1, arg2, arg3需要1個或多個字符串。它將相應的長表分開,分別給出arg2arg3(滿足他們的要求),其餘分配給arg1。如果你熟悉regex,這相當於

In [96]: re.match('(A+)(A+)(A+)','AAAAAAAAA').groups() 
Out[96]: ('AAAAAAA', 'A', 'A') 

(解析器無法讀取你的頭腦和分配所有「ARG2對args2只是因爲名字看起來相似。:))

所以,如果你需要以特定的方式分割參數列表,然後optionals(標誌)是要走的路。而在nargsrequired之間,你對數字有相當的控制權。

+0

謝謝你現在可以工作;) – Cadene

1

你想要什麼是不可能的。想一想:如果你要實現自己的參數解析而沒有​​,你如何確定一個位置參數是arg1參數列表中的最後一個,還是第一個arg2參數?

我認爲你已經知道的解決方案(可選參數)工作正常,甚至更好。

0

我需要添加=真和它的作品,這要歸功於hpaulj

parser = argparse.ArgumentParser() 
parser.add_argument('path', type=str, 
        help="path used for the generation of the rouge files") 
parser.add_argument('-s', '--systems', type=str, nargs='+', required=True, 
        help="path to the systems generated summary files") 
parser.add_argument('-m', '--models', type=str, nargs='+', required=True, 
        help="path to the reference summary files") 
args = parser.parse_args() 

python summary2rouge.py 
usage: summary2rouge.py [-h] -s SYSTEMS [SYSTEMS ...] -m MODELS [MODELS ...] 
        path 
summary2rouge.py: error: too few arguments