【问题标题】:how to implement the options/arguments for the command line functions in python如何在 python 中实现命令行函数的选项/参数
【发布时间】:2011-04-29 19:30:53
【问题描述】:

我的python版本是2.4.3。

现在我正在为 CD 播放器开发一个带有来自 python 的 cmd 模块的 CLI。我有一些类,如 CDContainer(使用 addCD、removeCD 等方法)、CD(使用播放、停止、暂停等方法)。现在,我想为命令添加一些选项,如果选项输入不正确,CLI 可能会返回有关错误输入类型或错误值的正确信息。例如,我想要“addcd --track 3 --cdname 惊悚片”。我现在正在做的是通过 获取所有参数,将其拆分,并将其分配给相关变量,如下所示。

我的问题是在 python 中,是否有一些模块可以方便我的案例解析和分析选项或参数?

修订:好的,我编辑它,感谢 gclj5 cmets。

import cmd
class CDContainerCLI(cmd.Cmd):

    def do_addcd(self, line):
        args=line.split()
        parser = OptionParser()
        parser.add_option("-t", "--track", dest="track_number", type="int",
            help="track number")
        parser.add_option("-n", "--cdname", dest="cd_name", type="string",
            help="CD name")
        (options, positional_args) = parser.parse_args(args)
        cd_obj= CD()
        cd_obj.addCD(options.track_number, options.cd_name)

如果可能的话,你能写一些代码示例,只是为了说明如何去做吗?

非常感谢!!

【问题讨论】:

    标签: python command-line command-line-arguments


    【解决方案1】:

    我的问题是在 python 中,是否有一些模块可以方便我的案例解析和分析选项或参数?

    是的,argparse module

    如果您已经熟悉 C 中的 getopt 库,that's also available as a python module - 虽然不太容易使用,如果您还没有习惯的话。

    【讨论】:

      【解决方案2】:

      根据您的 Python 版本,您应该查看 optparse(自 2.3 版起,自 2.7 版起已弃用)或 argparse(自 2.7 版起)。

      一些使用 optparse 的示例代码(line 是您在 CLI 中从标准输入读取的字符串):

      from optparse import OptionParser
      
      args = line.split()
      
      parser = OptionParser()
      parser.add_option("-t", "--track", dest="track_number", type="int",
                        help="track number")
      parser.add_option("-n", "--cdname", dest="cd_name", type="string",
                        help="CD name")
      
      # args[0] contains the actual command ("addcd" in this example).
      (options, positional_args) = add_cd_parser.parse_args(args[1:])
      
      if options.track_number != None and options.cd_name != None:
          cd_obj= CD()
          cd_obj.addCD(options.track_number, options.cd_name)
          print "add CD (track %d, name %s)" % (options.track_number, options.cd_name)
      

      这个解析器只处理你的“addcd”命令。例如,对于更多命令,您可以在字典中使用多个 OptionParser 对象,并将命令名称作为键。你可以像这样解析选项:

      (options, args) = parsers[args[0]].parse_args(args[1:])
      

      查看 optparse 的文档以获取更多信息。例如,输出使用信息非常容易。还有一个tutorial 可用。

      【讨论】:

      • 嗨,gclj5,谢谢你的回答。我正在使用 2.4.3。我听说过这个 optparse,但我不知道如何在我的代码中使用它。例如如何将它集成到 addcd 函数中?我应该在哪里以及如何添加它?
      • 我不知道你程序的确切结构,所以我不能告诉你在哪里添加它。但是我添加了一些示例代码来说明 optparse 包的用法。一般的想法是让 CLI 解析代码使用解析的选项调用相应的函数。
      • 嗨,gclj5,非常感谢您的代码。它是 args[0:],而不是 args[1:],因为 args 被作为方法的输入。我修改了原始帖子中的代码。但还是有一些问题。当出现一些异常(类型错误或缺少选项)时,此 optionparse 将退出整个程序,而不是仅针对相关方法退出。我们如何解决这个问题?
      • 只需捕获异常并自行处理错误(通知用户并退出方法)。另请参阅 optparse 教程中的 How optparse handles errors 部分。顺便说一句,在您的情况下,您不妨直接使用args(不使用[0:])。
      • 嗨,gclj5,所以如果我自己捕获异常并处理错误,则根本不需要 optparse。那正确吗?这有点令人失望,就在这么近的地方有什么好用的,但最后还是用不上。
      【解决方案3】:

      这是我几个月前写的一个演示脚本,当时我和我的同事正在学习argparse 模块。它说明了该模块的几个行为和特性:

      import sys
      import argparse
      
      def parse_command_line():
          # Define our argument parser.
          ap = argparse.ArgumentParser(
              description = 'This is a demo app for the argparse module.',
              epilog      = 'This text will appear after options.',
              usage       = '%(prog)s [options]',  # Auto-generated by default.
              add_help    = False,                 # Default is True.
          )
      
          # A grouping of options in the help text.
          gr = ap.add_argument_group('Required arguments')
      
          # A positional argument. This is indicated by the absense
          # of leading minus signs.
          gr.add_argument(
              'task',
              choices = ['get', 'put'],
              help = 'Task to be performed.', # Help text about an option.
              metavar = 'TASK', # Placeholder to be used in an option's help text.
                                # The default in this case would be "{get,put}".
          )
      
          # Another group.
          gr = ap.add_argument_group('Common options')
      
          # A basic option.
          gr.add_argument(
              '-s', '--subtask',
              action = 'store',  # This is the default.
                                 # One value will be stored, as a string, 
                                 # in opt.subtask
          )
      
          # A required option, with type conversion.
          gr.add_argument(
              '-u', '--user',
              required = True, # Options can be made mandatory.
                               # However, positional arguments can't be made optional.
              type = int,      # Convert opt.user to an integer.
                               # By default, it would be a string.
          )
      
          # A flag option.
          gr.add_argument(
              '--overwrite',
              dest = 'clobber',      # Store in opt.clobber rather than opt.overwrite.
              action = 'store_true', # If option is supplied, opt.clobber == True.
          )
      
          # Another group.
          gr = ap.add_argument_group('Some other options')
      
          # An option with multiple values.
          gr.add_argument(
              '--datasets',
              metavar = 'DATASET', # Default would be DATASETS.
              nargs = '+',  # If option is used, it takes 1 or more arguments.
                            # Will be stored as a list in opt.datasets.
              help = "The datasets to use for frobnication.",
          )
      
          # An option with a specific N of values.
          gr.add_argument(
              '--bar',
              nargs = 1,    # Takes exactly one argument. Differs from a basic
                            # option because opt.bar will be a list rather 
                            # than a string.
              default = [], # Default would be None.
          )
      
          # A file option.
          gr.add_argument(
              '--log',
              type    = argparse.FileType('w'),  # Will open a file for writing.
              default = sys.stdout,
              help    = 'Log file (default: STDOUT)',
          )
      
          # Another group.
          gr = ap.add_argument_group('Program information')
      
          # A version option.
          gr.add_argument(
              '-v', '--version',
              action = 'version', # Will display version text and exit.
              version = 'argparse_demo v1.2.0', # The version text.
          )
      
          # A help option.
          gr.add_argument(
              '-h', '--help',
              action = 'help', # Will display help text and exit.
          )
      
          # Parse the options.
          # If given no arguments, parse_args() works with sys.argv[1:].
          # And the object it returns will be of type Namespace.
          opt = ap.parse_args()
      
          return opt
      
      command_lines = [
          'argparse_demo.py put -u 1',
          'argparse_demo.py get -u 234 --over --data a b c --bar XYZ -s munch --log _log.txt',
          'argparse_demo.py -h', # Will exit() here.
      ]
      
      for c in command_lines:
          sys.argv = c.split()
          opt = parse_command_line()
          print opt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-10
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2012-03-08
        • 2015-07-05
        相关资源
        最近更新 更多