2014-06-18 17 views
0

這個問題延續了舊的問題@:how to access nargs of optparse-add_action?如何從用戶輸入(raw_input)修改nargs(的optparse-add_option)?

由於這個問題的答案是它是什麼。

簡介:

想,如果我使用像下面add_option實用程序:

parser.add_option('-c','--categories', dest='Categories', nargs=4) 

有沒有辦法從用戶輸入修改add_option()nargs使用raw_input

編輯: 我會給出我的「以前的問題需求」和「這個問題的需要」之間的明顯區別。

第一個問題的情況下:

我的腳本會要求用戶輸入,如果用戶沒有提供任何投入,也就是他剛剛運行

#./commandparser.py 

第二個問題情況下的要求是:

當我運行我的腳本./commandparser.py -c abc bac cad 它引發錯誤:commandparser.py: error: -c option requires 4 arguments並退出腳本。

而不是拋出錯誤並退出腳本。我想要一些機制,以便它要求用戶輸入剩餘的參數,即第四個參數而不退出腳本。

+0

對方回答表明您'nargs'既是可變輸入到'add_option'命令,和它返回的對象的屬性。將'rawinput'轉換爲'int'並將其值應用到任一位置。但你爲什麼要這樣做? – hpaulj

+2

通常'optparse'用於處理用戶給予腳本的第一件事情 - 命令行值。聽起來像你問用戶進一步的輸入,然後解析命令行。你不願意通過命令行獲得所有的用戶輸入嗎? – hpaulj

回答

0

你有沒有試圖接受這個選項可變數量的值?也就是說,使用'rawinput'來設置nargs,然後用它來解析命令行?

optparse文檔具有使用自定義回調處理可變數目的值的示例:

https://docs.python.org/2/library/optparse.html#callback-example-6-variable-arguments

​​,在另一方面,確實允許可變數目的值的,與nargs值喜歡 '?' (0或1),'+'(1或更多),'*'(0或更多)。


因爲我更熟悉​​我就勾勒出一個互動腳本來處理您的修改後的要求:

import argparse 
parser = argparse.ArgumentParser(prog='PROG') 
parser.add_argument('-c', '--categories', nargs='+', help='4 categories', default=[]) 
args = parser.parse_args() 
print(args) 
categories = args.categories 
while len(categories)<4: 
    print(parser.format_usage()) 
    x = raw_input('enter %s categories: '%(4-len(categories))).split() 
    categories.extend(x) 
print('categories', categories) 

如果「類別」是唯一的參數,你可以替換所有的​​東西(或optparse)與categories = sys.argv[1:][2:]如果您仍然期望'-c'標誌。


或者用optparse(改編自用於可變長度回調的文檔的例子):

def vararg_callback(option, opt_str, value, parser): 
    value = [] 
    for arg in parser.rargs: 
     # stop on --foo like options 
     if arg[:2] == "--" and len(arg) > 2: 
      break 
     # stop on -a (ignore the floats issue) 
     if arg[:1] == "-" and len(arg) > 1: 
      break 
     value.append(arg) 
    del parser.rargs[:len(value)] 
    setattr(parser.values, option.dest, value) 

def use_opt(): 
    import optparse 
    parser = optparse.OptionParser() 
    parser.add_option('-c','--categories', dest='categories', action="callback", callback=vararg_callback) 
    (options, args) = parser.parse_args() 
    print options, args 
    return options, args, parser 

args, rest, parser = use_opt() 
+0

我已更新編輯段中的問題,請讓知道是否可以使用回調或任何機制來解決該問題。 – kzs

+0

我已經添加了一個'argparse'解析器和交互式'填充'。 – hpaulj

+0

我的運氣不好argparse沒有在我的服務器工作,該礦2.6.5和我沒有安裝Python 3+ – kzs

相關問題