在Python中解析空选项

5 投票
6 回答
12388 浏览
提问于 2025-04-15 13:22

我有一个应用程序,可以让你把事件数据发送到一个自定义的脚本。你只需要设置命令行参数,并把事件数据和这些参数对应起来。问题是,这样做的灵活性不够。你设置的每个选项都会被使用,但并不是每个选项都有数据。所以,当应用程序准备要发送给脚本的字符串时,有些参数是空的,这就导致Python的OptionParser报错,提示“错误:--someargument选项需要一个参数”。

因为有超过200个数据点,我不能为每一种可能的参数组合写单独的脚本(这样会需要2^200个脚本)。那么,有没有办法在Python的OptionParser中处理空参数呢?

6 个回答

1

是的,当你添加这个选项时,有一个参数可以这样做:

from optparse import OptionParser
parser = OptionParser()
parser.add_option("--SomeData",action="store", dest="TheData", default='')

给这个默认参数一个你希望选项拥有的值,这样它就可以被指定,但这个参数是可选的。

1

我觉得 optparse 这个工具做不到这一点。argparse 是一个不同的(非标准)模块,它可以处理这种情况,也就是说选项可以有可选的值。

使用 optparse 的时候,你要么得指定选项和它的值,要么就两个都不写。

10

抱歉,我之前的回答误解了问题。你可以通过在定义选项时使用回调这个动作类型,来实现命令行标志的可选参数功能。使用下面这个函数作为回调(你可能需要根据自己的需求进行调整),并为每个可以选择性接收参数的标志进行配置:

import optparse

def optional_arg(arg_default):
    def func(option,opt_str,value,parser):
        if parser.rargs and not parser.rargs[0].startswith('-'):
            val=parser.rargs[0]
            parser.rargs.pop(0)
        else:
            val=arg_default
        setattr(parser.values,option.dest,val)
    return func

def main(args):
    parser=optparse.OptionParser()
    parser.add_option('--foo',action='callback',callback=optional_arg('empty'),dest='foo')
    parser.add_option('--file',action='store_true',default=False)
    return parser.parse_args(args)

if __name__=='__main__':
    import sys
    print main(sys.argv)



在命令行运行时,你会看到这样的输出:

# python parser.py
(<Values at 0x8e42d8: {'foo': None, 'file': False}>, [])

# python parser.py --foo
(<Values at 0x8e42d8: {'foo': 'empty', 'file': False}>, [])

# python parser.py --foo bar
(<Values at 0x8e42d8: {'foo': 'bar', 'file': False}>, [])

撰写回答