如何修改用户输入(raw_input)中的nargs(optparse-add_option)?

时间:2014-06-18 13:45:46

标签: python python-2.7 python-3.x optparse

此问题是旧问题的延续@: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个参数而不退出脚本。

1 个答案:

答案 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()