我正在为我的一个项目编写一个shell,它通过设计解析看起来像这样的命令:
COMMAND_NAME ARG1 =“长值”ARG2 = 123 ARG3=me@me.com
我的问题是Python的命令行解析库(getopt和optparse)迫使我在参数前面使用' - '或' - '。此行为与我的要求不符。
任何想法如何解决这个问题?任何现有的库?
答案 0 :(得分:10)
您可以使用shlex.split()将它们拆分,它可以处理您拥有的引用值,并且可以使用非常简单的正则表达式轻松解析它。或者,您可以使用正则表达式进行拆分和解析。或者只使用split()。
args = {}
for arg in shlex.split(cmdln_args):
key, value = arg.split('=', 1)
args[key] = value
答案 1 :(得分:9)
将您的参数(如Thomas建议的)转换为OptionParser格式。
parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
如果命令行参数不在sys.argv或类似的列表中但在字符串中,那么(如铁蛙建议的那样)使用shlex.split()
。
parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])
答案 2 :(得分:2)
Ironforggy的回应中的一个小的pythonic变体:
args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )
哎呀...... - 纠正了。
谢谢,J.F。塞巴斯蒂安 (必须记住那些单个参数生成器表达式)。答案 3 :(得分:1)
optmatch(http://www.coderazzi.net/python/optmatch/index.htm)怎么样?不是标准的,但采用不同的方法进行选项解析,并且它支持任何前缀:
OptionMatcher.setMode(optionPrefix = ' - ')
答案 4 :(得分:0)
如果没有对optparse或getopt进行相当密集的手术,我认为你不能明智地让它们解析你的格式。但是,您可以轻松地解析自己的格式,或将其转换为optparse可以处理的内容:
parser = optparse.OptionParser()
parser.add_option("--ARG1", dest="arg1", help="....")
parser.add_option(...)
...
newargs = sys.argv[:1]
for idx, arg in enumerate(sys.argv[1:])
parts = arg.split('=', 1)
if len(parts) < 2:
# End of options, don't translate the rest.
newargs.extend(sys.argv[idx+1:])
break
argname, argvalue = parts
newargs.extend(["--%s" % argname, argvalue])
parser.parse_args(newargs)
答案 5 :(得分:0)
答案 6 :(得分:0)
您可能对我编写的一些Python模块感兴趣,以便更轻松地处理命令行参数(开源和免费使用) - http://freshmeat.net/projects/commando