我正在为我的一个项目编写一个 shell,它通过设计解析如下所示的命令:
COMMAND_NAME ARG1="长值" ARG2=123 ARG3=me@me.com
我的问题是 Python 的命令行解析库(getopt 和 optparse)迫使我在参数前使用“-”或“--”。这种行为不符合我的要求。
任何想法如何解决?任何现有的图书馆?
我正在为我的一个项目编写一个 shell,它通过设计解析如下所示的命令:
COMMAND_NAME ARG1="长值" ARG2=123 ARG3=me@me.com
我的问题是 Python 的命令行解析库(getopt 和 optparse)迫使我在参数前使用“-”或“--”。这种行为不符合我的要求。
任何想法如何解决?任何现有的图书馆?
您可以使用 shlex.split() 将它们拆分,它可以处理您拥有的引用值,并使用非常简单的正则表达式很容易地解析它。或者,您可以只使用正则表达式进行拆分和解析。或者干脆使用 split()。
args = {}
for arg in shlex.split(cmdln_args):
key, value = arg.split('=', 1)
args[key] = value
尝试遵循“命令行界面标准”
将您的参数(如 Thomas 建议的那样)转换为 OptionParser 格式。
parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
如果命令行参数不在 sys.argv 或类似列表中,而是在字符串中,则(如 ironfroggy 建议的那样)使用shlex.split()
.
parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])
Ironforggy 的 shlex 答案的一个小的 Pythonic 变体:
args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )
哎呀... - 更正。
谢谢,JF Sebastian(记住那些单参数生成器表达式)。
optmatch(http://www.coderazzi.net/python/optmatch/index.htm)呢?不是标准的,但对选项解析采用不同的方法,它支持任何前缀:
OptionMatcher.setMode(optionPrefix='-')
如果没有对 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)
您可能对我编写的一个小 Python 模块感兴趣,它可以使命令行参数的处理更加容易(开源且免费使用)- http://freshmeat.net/projects/commando