7

我正在为我的一个项目编写一个 shell,它通过设计解析如下所示的命令:

COMMAND_NAME ARG1="长值" ARG2=123 ARG3=me@me.com

我的问题是 Python 的命令行解析库(getopt 和 optparse)迫使我在参数前使用“-”或“--”。这种行为不符合我的要求。

任何想法如何解决?任何现有的图书馆?

4

7 回答 7

10

您可以使用 shlex.split() 将它们拆分,它可以处理您拥有的引用值,并使用非常简单的正则表达式很容易地解析它。或者,您可以只使用正则表达式进行拆分和解析。或者干脆使用 split()。

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value
于 2008-10-01T10:09:19.990 回答
9
  1. 尝试遵循“命令行界面标准

  2. 将您的参数(如 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)])
于 2008-10-01T10:57:17.283 回答
2

Ironforggy 的 shlex 答案的一个小的 Pythonic 变体:

args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )

哎呀... - 更正。

谢谢,JF Sebastian(记住那些单参数生成器表达式)。

于 2008-10-01T10:48:45.230 回答
1

optmatch(http://www.coderazzi.net/python/optmatch/index.htm)呢?不是标准的,但对选项解析采用不同的方法,它支持任何前缀:

OptionMatcher.setMode(optionPrefix='-')

于 2009-11-19T00:30:04.627 回答
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)
于 2008-10-01T09:50:33.717 回答
0

派对迟到了……但PEP 389允许这样做以及更多。

如果您的 Python 版本需要,这里有一个不错的库 code.google.com/p/argparse

享受。

于 2010-04-16T14:18:42.670 回答
0

您可能对我编写的一个小 Python 模块感兴趣,它可以使命令行参数的处理更加容易(开源且免费使用)- http://freshmeat.net/projects/commando

于 2011-02-06T14:17:52.713 回答