Perl的Getopt::Long
,你可以很容易的定義帶有可變數量的參數的命令行選項:在Python的optparse模塊中,你如何創建一個需要可變數量參數的選項?
foo.pl --files a.txt --verbose
foo.pl --files a.txt b.txt c.txt --verbose
有沒有辦法直接與Python的optparse
模塊做到這一點?據我所知,nargs
選項屬性可用於指定固定數量的選項參數,並且我還沒有在文檔中看到其他選項。
Perl的Getopt::Long
,你可以很容易的定義帶有可變數量的參數的命令行選項:在Python的optparse模塊中,你如何創建一個需要可變數量參數的選項?
foo.pl --files a.txt --verbose
foo.pl --files a.txt b.txt c.txt --verbose
有沒有辦法直接與Python的optparse
模塊做到這一點?據我所知,nargs
選項屬性可用於指定固定數量的選項參數,並且我還沒有在文檔中看到其他選項。
我認爲optparse
不支持你所要求的(不是直接的 - 正如你注意到的,如果你願意做所有額外的回調工作,你可以做到這一點!)。你也可以用第三方擴展argparse來做到這一點,它支持可變數量的參數(並且還增加了其他一些功能)。
This URL文件的add_argument
- 通過nargs='*'
讓選項取零個或多個參數,'+'
讓它採取一個或多個參數等
`argparse`是在Python 2.7+ http://docs.python.org/library/argparse.html – jfs 2010-07-06 00:23:33
是的,但如果你還不能升級到2.7(前天發佈),第三方軟件包是仍然是天賜之物!) – 2010-07-06 00:59:24
我的錯誤:剛發現這個Callback Example 6。
這絕對是確切問題的最佳答案; argparse要好得多,但你不能總是輕易使用它:例如。在Django管理命令中。 – Stefano 2012-05-23 16:44:23
你會不會跟這個更好?
foo.pl --files a.txt,b.txt,c.txt --verbose
不,絕對不是。例如,這將禁止shell擴展,如`foo.py * .txt`。 – Constantinius 2012-07-04 13:34:43
這花了我一點時間才弄清楚,但是您可以使用回調操作來完成此操作。在這個例子中檢查我如何獲取任意數量的參數給「--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
唯一的副作用是你得到你的參數而不是元組。但是,這可以很容易地解決,因爲我的特殊用例需要列表。
這裏有一種方法:取fileLst生成的字符串作爲一個字符串,然後用http://docs.python.org/2/library/glob.html做擴張唉,這可能不是沒有逃脫*
實際工作,得到了一個更好的辦法: 蟒蛇myprog.py -V -l 1000 /home/dominic/radar/*.json < - 如果這是命令行
解析器,選擇採用= parse_args()
inFileLst = parser.largs
我最近自己也遇到了這個問題:我在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函數即可。
通過參數指定文件名,而不是通過選項:`foo.pl a.txt b.txt c。txt --verbose`在這種情況下,文件名將被放入參數中。 – jfs 2009-06-22 06:21:47
如果--files定義輸入,則不建議使用此方法。 – 2009-06-22 11:51:25