【问题标题】:To understand Python's optparse了解 Python 的 optparse
【发布时间】:2009-11-19 23:07:13
【问题描述】:

感谢江湖君指点一二!

以下代码是我第一次尝试使用 Optparse 编写代码。

在获得 Optparse 的帮助时如何解决以下错误?

#!/usr/bin/env python
import sys
import os
from optparse import OptionParser


e = sys.argv[1]
b = sys.argv[2]
no = sys.argv[3]

def set_figu(figu):
        sum = 777
        return sum


def main():
        usage = "Usage: negative_bin_base.py <eksponentti> <siirre> <figu>"
        parser = OptionParser(usage)
        parser.add_option("-h", "--help", dest="help",
                        help="get synopsis of parameters")
        # print the output of the work-horse
        print set_figu(no)

        (options, args) = parser.parse_args()
        if len(args) < 4:
                parser.error("incorrect number of arguments")
        if options.informative:
                print "reading %s..." % options.help

if __name__ == "__main__":
        main()

参数数量正确的错误输出示例

python negative_bin_base.py 13 13 332
Traceback (most recent call last):
  File "negative_bin_base.py", line 37, in <module>
    main()
  File "negative_bin_base.py", line 26, in main
    help="get synopsis of parameters")
  File "/usr/lib/python2.6/optparse.py", line 1020, in add_option
    self._check_conflict(option)
  File "/usr/lib/python2.6/optparse.py", line 995, in _check_conflict
    option)
optparse.OptionConflictError: option -h/--help: conflicting option string(s): -h, --help

【问题讨论】:

  • 查看 optparse 模块,这在常见情况下会变得相当容易:docs.python.org/library/optparse.html
  • 一次性处理 args 没问题,但从长远来看,花时间学习 optparse 是值得的。

标签: python debugging arguments


【解决方案1】:

class optparse.OptionParser(...) 的构造函数具有可选的命名参数“add_help_option”,默认为“True”。如果您想提供自己的帮助选项和消息,则必须明确拒绝默认帮助选项和消息。

parser = OptionParser(usage, add_help_option=False)

【讨论】:

【解决方案2】:

错误是您的参数数组包含脚本的名称为sys.argv[0]。因此,您的 if 是不一样的:

# python sys.argv[0] sys.argv[1] sys.argv[2] sys.argv[3]
if len(sys.argv) < 4:
        sys.exit(usage)

【讨论】:

    【解决方案3】:

    根据上面的示例,这应该可以满足您的要求:

    #!/usr/bin/env python
    from optparse import OptionParser
    
    def main():
        usage = "Usage: negative_bin_base.py <eksponentti> <siirre> <figu>"
        parser = OptionParser(usage)
        (options, args) = parser.parse_args()
        if len(args) != 3:
            parser.error("incorrect number of arguments")
        e = args[0]
        b = args[1]
        no = args[2]
        # ...
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      【解决方案4】:

      对于使用 optparse,我通常会这样做:

      1. 将命令行解析与主代码库分开,以实现更好的模块化。 (把处理放在 "if __name__ == "__main__"" 之后)

      2. 让 optparse 处理您的帮助。 (使用 parser.print_help())

      3. 使用 optparse 构造,如果您不喜欢它们,只需自己解析 sys.argv。 (使用 add_option 定义你需要的选项)

      以下是我将如何使用 optparse 库编写您的示例:

      def main():
          print 'Welcome to the main event!'
      
      
      if __name__ == '__main__':
          import optparse
          parser = optparse.OptionParser()
          parser.add_option("-e", "--eksponentti", dest="eksponentti",
                            help="This is help for <eksponentti>.",
                            default=None)
          parser.add_option("-s", "--siirre", dest="siirre",
                            help="This is help for <siirre>.",
                            default=None)
          parser.add_option("-f", "--figu", dest="figu",
                            help="This is help for <figu>.",
                            default=None)
      
          (options, args) = parser.parse_args()
          if options.eksponentti and options.siirre and options.figu:
              main()
          else:
              print "ERROR -- Expected Arguments not given!"
              parser.print_help()
      

      在没有必要选项的情况下运行它会得到以下输出: (比我在这里格式化的要漂亮一点……)

      ERROR -- Expected Arguments not given! Usage: parm.py [options]
      
      Options:   
          -h, --help            show this help message and exit   
          -e EKSPONENTTI, --eksponentti=EKSPONENTTI This is help for <eksponentti>.   
          -s SIIRRE, --siirre=SIIRRE This is help for <siirre>.   
          -f FIGU, --figu=FIGU  This is help for <figu>.
      

      【讨论】:

      • 如果 options.eksponentti 和 options.siirre 和 options.figu:`,你如何阅读这一行?我在命令中使用了 3 个参数,并且 if 子句不正确。
      • monkut 改变了您的命令行选项的处理方式,他为您命名了选项。例如,python negative_bin_base.py -e 13 -s 13 -f 332
      • 谢谢,约翰。是的,options.
      猜你喜欢
      • 1970-01-01
      • 2011-11-22
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多