2009-06-22 22 views
11

Perl的Getopt::Long,你可以很容易的定義帶有可變數量的參數的命令行選項:在Python的optparse模塊中,你如何創建一個需要可變數量參數的選項?

foo.pl --files a.txt    --verbose 
foo.pl --files a.txt b.txt c.txt --verbose 

有沒有辦法直接與Python的optparse模塊做到這一點?據我所知,nargs選項屬性可用於指定固定數量的選項參數,並且我還沒有在文檔中看到其他選項。

+1

通過參數指定文件名,而不是通過選項:`foo.pl a.txt b.txt c。txt --verbose`在這種情況下,文件名將被放入參數中。 – jfs 2009-06-22 06:21:47

+0

如果--files定義輸入,則不建議使用此方法。 – 2009-06-22 11:51:25

回答

8

我認爲optparse不支持你所要求的(不是直接的 - 正如你注意到的,如果你願意做所有額外的回調工作,你可以做到這一點!)。你也可以用第三方擴展argparse來做到這一點,它支持可變數量的參數(並且還增加了其他一些功能)。

This URL文件​​的add_argument - 通過nargs='*'讓選項取零個或多個參數,'+'讓它採取一個或多個參數等

+4

`argparse`是在Python 2.7+ http://docs.python.org/library/argparse.html – jfs 2010-07-06 00:23:33

+2

是的,但如果你還不能升級到2.7(前天發佈),第三方軟件包是仍然是天賜之物!) – 2010-07-06 00:59:24

9

我的錯誤:剛發現這個Callback Example 6

+4

這絕對是確切問題的最佳答案; argparse要好得多,但你不能總是輕易使用​​它:例如。在Django管理命令中。 – Stefano 2012-05-23 16:44:23

2

你會不會跟這個更好?

foo.pl --files a.txt,b.txt,c.txt --verbose 
+1

不,絕對不是。例如,這將禁止shell擴展,如`foo.py * .txt`。 – Constantinius 2012-07-04 13:34:43

20

這花了我一點時間才弄清楚,但是您可以使用回調操作來完成此操作。在這個例子中檢查我如何獲取任意數量的參數給「--file」標誌。

from optparse import OptionParser, 

def cb(option, opt_str, value, parser): 
     args=[] 
     for arg in parser.rargs: 
       if arg[0] != "-": 
         args.append(arg) 
       else: 
         del parser.rargs[:len(args)] 
         break 
     if getattr(parser.values, option.dest): 
       args.extend(getattr(parser.values, option.dest)) 
     setattr(parser.values, option.dest, args) 

parser=OptionParser() 
parser.add_option("-q", "--quiet", 
     action="store_false", dest="verbose", 
     help="be vewwy quiet (I'm hunting wabbits)") 
parser.add_option("-f", "--filename", 
     action="callback", callback=cb, dest="file") 

(options, args) = parser.parse_args() 

print options.file 
print args 

唯一的副作用是你得到你的參數而不是元組。但是,這可以很容易地解決,因爲我的特殊用例需要列表。

0

這裏有一種方法:取fileLst生成的字符串作爲一個字符串,然後用http://docs.python.org/2/library/glob.html做擴張唉,這可能不是沒有逃脫*

實際工作,得到了一個更好的辦法: 蟒蛇myprog.py -V -l 1000 /home/dominic/radar/*.json < - 如果這是命令行

解析器,選擇採用= parse_args()

inFileLst = parser.largs

1

我最近自己也遇到了這個問題:我在Python 2.6中,需要一個選項來獲取可變數量的參數。我試圖使用大衛的解決方案,但發現是,在默認情況下,通過add_options增加了一個新的選項被假定爲有它不會也沒有明確設置NARGS工作,以0

def arg_list(option, opt_str, value, parser): 
    args = set() 
    for arg in parser.rargs: 
     if arg[0] == '-': 
      break 
     args.add(arg) 
     parser.rargs.pop(0) 
    setattr(parser.values, option.dest, args) 

parser=OptionParser() 
parser.disable_interspersed_args() 
parser.add_option("-f", "--filename", action="callback", callback=arg_list, 
        dest="file", nargs=0) 

(options, args) = parser.parse_args() 

問題NARGS = 1當nargs> 0時,OptionParser會在rargs中彈出項目並在調用任何回調之前將它們賦值。因此,對於沒有指定narg的選項,在你的回調被調用時,rargs將總是被關閉。

此回調函數可以用於任意數量的選項,只需要調用callback_args而不是setattr函數即可。

相關問題