要了解Python的optparse

时间:2009-11-19 23:07:14

标签: python debugging arguments

感谢你唠叨指出一个一个!

以下代码是我第一次使用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

4 个答案:

答案 0 :(得分:8)

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

parser = OptionParser(usage, add_help_option=False)

答案 1 :(得分:6)

错误是您的arguments数组包含脚本名称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)

答案 2 :(得分:1)

根据上面的示例,这应该符合您的要求:

#!/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()

答案 3 :(得分:1)

在这里使用optparse是我通常做的事情:

  1. 从主代码库中分离命令行解析,以实现更好的模块化。 (将处理权放在“if __name__ ==”__main __“”之后)

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

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

  4. 以下是我使用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>.