此问题是旧问题的延续@:how to access nargs of optparse-add_action?
因为这个问题得到了回答。
简介:
假设我使用如下所示的add_option实用程序:
parser.add_option('-c','--categories', dest='Categories', nargs=4 )
有没有办法使用nargs
修改用户输入add_option()
的{{1}}。?
修改 我将明确区分我之前的问题"和#34;这个问题需要"。
第一个问题案例:
如果用户没有提供任何输入,我的脚本会询问用户输入,即他刚刚运行
raw_input
第二个问题案例要求是:
当我运行我的脚本时./commandparser.py -c abc bac cad
它抛出错误:#./commandparser.py
并退出脚本。
而不是抛出错误并退出脚本。我想要一些机制,以便它要求用户输入剩余的参数,即第4个参数而不退出脚本。
答案 0 :(得分:0)
您是否有机会尝试接受此选项的可变数量的值?也就是说,使用'rawinput'设置nargs
,然后用它来解析命令行?
optparse
文档中有一个使用自定义回调来处理可变数量值的示例:
https://docs.python.org/2/library/optparse.html#callback-example-6-variable-arguments
另一方面, argparse
允许使用可变数量的值,其中nargs
值类似于“?” (0或1),'+'(1或更多),'*'(0或更多)。
由于我更熟悉argparse
,我将草拟一个交互式脚本来处理修订后的要求:
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)
如果'类别'是唯一的参数,您可以将所有argparse
内容(或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()