【问题标题】:Customized command line parsing in PythonPython中的自定义命令行解析
【发布时间】:2010-09-14 11:41:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • “长值”中的空白可能会给您带来额外的麻烦。我不确定 optparse(或其他库)可以处理这个问题。
  • @Ralph:optparse 处理“长值”就好了。

标签: python parsing shell command-line arguments


【解决方案1】:

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

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value

【讨论】:

  • 在python 2.5及以上,还可以这样做:key,_,value=arg.partition('=')
  • args = dict(arg.split('=', 1) for arg in shlex.split(cmdln_args))
【解决方案2】:
  1. 尝试关注“Standards for Command Line Interfaces

  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)])

【讨论】:

    【解决方案3】:

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

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

    糟糕... - 已更正。

    谢谢,J.F. 塞巴斯蒂安 (必须记住那些单参数生成器表达式)。

    【讨论】:

      【解决方案4】:

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

      OptionMatcher.setMode(optionPrefix='-')

      【讨论】:

      • @rafalotufo,我认为您对这个问题的提议编辑应该是一个评论——指出提议的解决方案将无法正常工作,这极大地改变了答案的含义。 :)
      【解决方案5】:

      如果不对 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)
      

      【讨论】:

        【解决方案6】:

        晚会有点晚了...但PEP 389 允许这样做以及更多。

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

        享受吧。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-09
            • 1970-01-01
            • 1970-01-01
            • 2020-01-25
            • 2016-02-07
            • 2016-10-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多