我有一个应用程序,它允许你将事件数据发送到一个自定义脚本。 您只需铺陈命令行参数,并指定哪些事件数据与什么争论还在继续。 问题是,有没有真正的灵活性在这里。 每一个选项,你绘制出将被使用,但不是每一个选项都必然会数据。 所以,当应用程序构建发送给脚本的字符串,一些参数是空白,Python的OptionParser错误出与“错误:--someargument选项需要一个参数”
作为有数据的逾200点,它不喜欢我可以写单独的脚本来处理可能的参数每个组合(这将需要2 ^ 200脚本)。 有没有办法来处理Python的optionparser空参数?
Answer 1:
对不起,误会了我的第一个答案的问题。 你可以做到有可选的参数命令,当你定义的选项行标志使用回调动作类型的能力。 使用下面的函数作为回调(你可能会希望满足你的需要),并配置它为每一个可以选择性地接收参数的标志:
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}>, [])
Answer 2:
我不认为optparse
可以做到这一点。 argparse
是一个不同(非标准)的模块,可以处理这样的情况 ,其中的选项具有可选值。
随着optparse
你必须要么必须指定,包括它的值,或离开了这两个选项。
Answer 3:
是的,有一种说法是这样做的,当你添加选项:
from optparse import OptionParser
parser = OptionParser()
parser.add_option("--SomeData",action="store", dest="TheData", default='')
给默认的参数,你想要的选项,但应规定,但有选择地将参数值。
Answer 4:
Optparse已经允许传递空字符串作为一个选项参数。 因此,如果可能的话,把一个空字符串为“没有价值”。 对于长选项,以下任何工作:
my_script --opt= --anotheroption
my_script --opt='' --anotheroption
my_script --opt="" --anotheroption
my_script --opt '' --anotheroption
my_script --opt "" --anotheroption
对于短样式选项,您可以使用任一:
my_script -o '' --anotheroption
my_script -o "" --anotheroption
警告:这已经在Linux下测试,应该努力在其他类UNIX系统的系统相同; Windows处理命令行报价不同,可能不接受上面列出的所有变种。
Answer 5:
马克·罗迪的解决方案的工作,但它需要在运行时属性的解析器对象的修改,并具有比其他替代选择打印格式不支持 - 或 - 稍微较少涉及的解决方案是optparse运行之前修改sys.argv中阵列并且不需要有参数的切换之后插入一个空字符串(“”)。 这种方法的唯一限制是,你有你的选择默认为比你插入sys.argv中的另外一个可预测值(我选择无,下面的例子,但它其实并不重要)。
下面的代码通过sys.argv中创建的选项的示例解析器和集,允许提取开关阵列从解析器(使用的实例变量魔法一点点),然后进行迭代,每一次它找到一个允许的开关,它检查是否有人不遵循任何参数给出。 如果有一个开关后没有参数,空字符串将被插入在命令行上。 改变sys.argv中后,解析器调用,您可以检查其值为“”选项,并采取相应的行动。
#Instantiate the parser, and add some options; set the options' default values to None, or something predictable that
#can be checked later.
PARSER_DEFAULTVAL = None
parser = OptionParser(usage="%prog -[MODE] INPUT [options]")
#This method doesn't work if interspersed switches and arguments are allowed.
parser.allow_interspersed_args = False
parser.add_option("-d", "--delete", action="store", type="string", dest="to_delete", default=PARSER_DEFAULTVAL)
parser.add_option("-a", "--add", action="store", type="string", dest="to_add", default=PARSER_DEFAULTVAL)
#Build a list of allowed switches, in this case ['-d', '--delete', '-a', '--add'] so that you can check if something
#found on sys.argv is indeed a valid switch. This is trivial to make by hand in a short example, but if a program has
#a lot of options, or if you want an idiot-proof way of getting all added options without modifying a list yourself,
#this way is durable. If you are using OptionGroups, simply run the loop below with each group's option_list field.
allowed_switches = []
for opt in parser.option_list:
#Add the short (-a) and long (--add) form of each switch to the list.
allowed_switches.extend(opt._short_opts + opt._long_opts)
#Insert empty-string values into sys.argv whenever a switch without arguments is found.
for a in range(len(sys.argv)):
arg = sys.argv[a]
#Check if the sys.argv value is a switch
if arg in allowed_switches:
#Check if it doesn't have an accompanying argument (i.e. if it is followed by another switch, or if it is last
#on the command line)
if a == len(sys.argv) - 1 or argv[a + 1] in allowed_switches:
sys.argv.insert(a + 1, "")
options, args = parser.parse_args()
#If the option is present (i.e. wasn't set to the default value)
if not (options.to_delete == PARSER_DEFAULTVAL):
if options.droptables_ids_csv == "":
#The switch was not used with any arguments.
...
else:
#The switch had arguments.
...
Answer 6:
检查后cp
命令理解如--backup=simple
但不 --backup simple
,我回答这个问题是这样的:
import sys
from optparse import OptionParser
def add_optval_option(pog, *args, **kwargs):
if 'empty' in kwargs:
empty_val = kwargs.pop('empty')
for i in range(1, len(sys.argv)):
a = sys.argv[i]
if a in args:
sys.argv.insert(i+1, empty_val)
break
pog.add_option(*args, **kwargs)
def main(args):
parser = OptionParser()
add_optval_option(parser,
'--foo', '-f',
default='MISSING',
empty='EMPTY',
help='"EMPTY" if given without a value. Note: '
'--foo=VALUE will work; --foo VALUE will *not*!')
o, a = parser.parse_args(args)
print 'Options:'
print ' --foo/-f:', o.foo
if a[1:]:
print 'Positional arguments:'
for arg in a[1:]:
print ' ', arg
else:
print 'No positional arguments'
if __name__=='__main__':
import sys
main(sys.argv)
自广告:这是一部分opo
我的模块thebops
包... ;-)
文章来源: Parsing empty options in Python