在Jython中使用optparse添加子选项

2024-04-28 22:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用optparse向Jython脚本添加选项。他们就像

$script.py -clear
$script.py -start
$script.py -stop 

所以,现在我的问题是如何将子选项添加到任何特定的选项中,比如

^{pr2}$

因为可能有很多选项,我无法通过在单个级别捕获所有选项来验证或提供帮助。我发现有些脚本可以选择

$script.py -start --help

->;这将只提供可以给父项“start”选项的选项。所以请帮助我如何实现这一目标

谢谢, 查克里语


Tags: pygt脚本选项scripthelpjython级别
3条回答

我最近也有同样的问题。对我有效的解决方案是:

  • 按照惯例,使用第一个参数来表示所需的命令 执行(这将是您的startclearstop

  • 通过sys.argv[1]获得这个命令(我知道这是一个难看的命令 解决方法)

  • 创建几个optparse.OptionParser()(每个命令一个)

  • 只调用适当的parse_args()方法OptionParser

  • 如果命令无效或丢失,请创建另一个选项解析器以显示用法

下面是一个示例代码:

# parse.py

import sys
import optparse

def parse_my_command_line():

    opt_parser = {}
    opt_parser['start'] = optparse.OptionParser()
    opt_parser['clear'] = optparse.OptionParser()
    opt_parser['stop']  = optparse.OptionParser()

    # Start
    opt_parser['start'].usage = 'Help for the START command'
    opt_parser['start'].add_option(' name', default = None, type = 'str',
        help = 'help for  name option', metavar = '<name>')
    opt_parser['start'].add_option(' type', default = None, type = 'str',
        help = 'help for  type option', metavar = '<type>')

    # Clear
    opt_parser['clear'].usage = 'Help for the CLEAR command'
    opt_parser['clear'].add_option(' foo', default = None, type = 'str',
        help = 'help for  foo option', metavar = '<foo>')

    # Stop
    opt_parser['stop'].usage = 'Help for the STOP command'
    opt_parser['stop'].add_option(' name', default = None, type = 'str',
        help = 'help for  name option', metavar = '<name>')
    opt_parser['stop'].add_option(' type', default = None, type = 'str',
        help = 'help for  type option', metavar = '<type>')

    # Get the command from sys.argv
    try:
        command = sys.argv[1]
    except IndexError:
        command = None

    # Get the appropriate option parser
    try:
        parser = opt_parser[command]
        # Done. Parse arguments and return.
        return parser.parse_args()
    except KeyError:
        # Invalid command. Create a parser to show default usage
        parser       = optparse.OptionParser()
        parser.usage  = '%prog [command] [options]\n\n'
        parser.usage += 'Description:\n'
        parser.usage += '  General help for %prog\n\n'
        parser.usage += 'Commands:\n'
        for cmd in ['start', 'clear', 'stop']:
            parser.usage += '  %s\n' % cmd
            parser.usage += '    %s\n\n' % opt_parser[cmd].usage
        parser.usage = parser.usage.strip()
        if command is None:
            parser.error('command cannot be empty')
        else:
            parser.error('invalid command: %s' % command)



def main():
    options, args = parse_my_command_line()
    print 'Args    = %s' % args
    print 'Options = %s' % options

if __name__ == '__main__':
    main()

以下是一些结果:

^{pr2}$

没有办法添加“sub”选项。一般来说,帮助选项是由$script.py help start这样的方式完成的,其中start只是一个字符串选项,您可以读取并显示相应的信息。在

这正是OptionParser设计用来处理的!在

考虑以下代码:

import sys
import os

from optparse import OptionParser

__all__ = []
__version__ = 0.1
__date__ = '2014-01-21'
__updated__ = '2014-01-21'


def main(argv=None):
    '''Command line options.'''

    program_name = os.path.basename(sys.argv[0])
    program_version = "v0.1"
    program_build_date = "%s" % __updated__

    program_version_string = '%%prog %s (%s)' % (program_version, program_build_date)

    program_longdesc = '''This will be displayed beneath your help information''' # optional - give further explanation about what the program does
    program_license = "Copyright 2014 Code Tester (Jython Dev Inc.)                                            \
                Licensed under the Apache License 2.0\nhttp://www.apache.org/licenses/LICENSE-2.0"

    if argv is None:
        argv = sys.argv[1:]
    try:
        # setup option parser
        parser = OptionParser(version=program_version_string, epilog=program_longdesc, description=program_license)
        parser.add_option("-i", " in", dest="infile", help="set input path [default: %default]", metavar="FILE")
        parser.add_option("-o", " out", dest="outfile", help="set output path [default: %default]", metavar="FILE")
        parser.add_option("-d", " debug", dest="modeDebug", action="store_true", help="Prints additional debug information")
        parser.add_option("-m", " map", dest="listKVPs", action="append", help="Key value pair mappings (i.e. left=right)", metavar="KVP")
        parser.add_option("-r", " role", dest="listProtectedRoles", action="append", help="Protected system roles to use (multiple allowed)", metavar="Role")
        parser.add_option("-u", " user", dest="listProtectedUsers", action="append", help="Protected system users to be used (multiple allowed)", metavar="User")

        # set defaults
        parser.set_defaults(outfile="./out.txt", infile="./in.txt")

        # process options
        (opts, args) = parser.parse_args(argv)

        if opts.modeDebug:
            print("Running in DEBUG mode")
        if opts.infile:
            print("infile = %s" % opts.infile)
        if opts.outfile:
            print("outfile = %s" % opts.outfile)
        if opts.listKVPs:
            print("KVP's = %s" % opts.listKVPs)
        if opts.listProtectedRoles:
            print("Protected Roles = %s" % opts.listProtectedRoles)
        if opts.listProtectedUsers:
            print("Protected Users = %s" % opts.listProtectedUsers)

        '''
        Do something interesting with the parameters here!
        '''


    except Exception, e:
        indent = len(program_name) * " "
        sys.stderr.write(program_name + ": " + repr(e) + "\n")
        sys.stderr.write(indent + "  for help use  help")
        return 2


if __name__ == "__main__":
    sys.exit(main())

如果使用-h(或帮助)运行此程序,则会得到以下结果:

^{pr2}$

现在,如果我们用更多的参数来运行它,例如:

testScript.py -d -i input.txt -o output.txt -m jython=cool -r Admins -r DomainAdmins

我们得到如下输出:

Running in DEBUG mode
infile = input.txt
outfile = output.txt
KVP's = ['jython=cool']
Protected Roles = ['Admins', 'DomainAdmins']

注意以下几点:

  • 命令行中参数的顺序并不重要(只要参数随相关标志一起提供)
  • 本例中的-d选项用作“store_true”参数,以指示它是一个布尔标志
  • 其他参数都采用附加值
  • 如果接受值的参数可以接受多个值,则可以将其声明为列表(使用append操作)
  • 处理完所有参数后,仍然可以通过“args”变量获得任何其他命令行参数。在

有关详细信息,请查看http://jython.org/docs/library/optparse.html

相关问题 更多 >