0

Jython スクリプトにオプションを追加するために optparse を使用しています。彼らは似ています

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

など、私の質問は、特定のオプションにサブオプションを追加する方法です。

$script.py -start -name <name> -type <type>,

多くのオプションが存在する可能性があり、すべてのオプションを 1 つのレベルで把握して検証したり、支援を提供したりすることはできないためです。そして、いくつかのスクリプトには次のようなオプションがあることがわかりました

$script.py -start --help

-> これにより、親オプション ' ' に指定できるオプションのみが指定されstartます。どうすればこれを達成できますか

ありがとう、チャクリ

4

3 に答える 3

0

私は最近同じ問題を抱えていました。私にとってうまくいった解決策は次のとおりです。

  • 慣例として、最初の引数を使用して、実行するコマンドを表します (これはstart、 、clear、 になりますstop) 。

  • このコマンドを取得しますsys.argv[1](これは醜い回避策であることはわかっています)

  • 複数作成optparse.OptionParser()(コマンドごとに 1 つ)

  • 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()

ここにいくつかの結果があります:

[usr@localhost ~]$ python parse.py
Usage: parse.py [command] [options]

Description:
  General help for parse.py

Commands:
  start
    Help for the START command

  clear
    Help for the CLEAR command

  stop
    Help for the STOP command

parse.py: error: command cannot be empty

[usr@localhost ~]$ python parse.py start
Args    = ['start']
Options = {'type': None, 'name': None}

[usr@localhost ~]$ python parse.py stop
Args    = ['stop']
Options = {'type': None, 'name': None}

[usr@localhost ~]$ python parse.py clear
Args    = ['clear']
Options = {'foo': None}

[usr@localhost ~]$ python parse.py start --help
Usage: Help for the START command

Options:
  -h, --help     show this help message and exit
  --name=<name>  help for --name option
  --type=<type>  help for --type option
[usr@localhost ~]$ python parse.py stop -- help
Args    = ['stop', 'help']
Options = {'type': None, 'name': None}

[usr@localhost ~]$ python parse.py clear --help
Usage: Help for the CLEAR command

Options:
  -h, --help   show this help message and exit
  --foo=<foo>  help for --foo option
于 2013-04-03T08:42:09.857 に答える
0

これはまさに 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 (または --help) を指定してこれを実行すると、次の結果が得られます。

Usage: OptParseExample.py [options]

Copyright 2014 Code Tester (Jython Dev Inc.)
Licensed under the Apache License 2.0
http://www.apache.org/licenses/LICENSE-2.0

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -i FILE, --in=FILE    set input path [default: ./in.txt]
  -o FILE, --out=FILE   set output path [default: ./out.txt]
  -d, --debug           Prints additional debug information
  -m KVP, --map=KVP     Key value pair mappings (i.e. left=right)
  -r Role, --role=Role  Protected system roles to use (multiple allowed)
  -u User, --user=User  Protected system users to be used (multiple allowed)

This will be displayed beneath your help information

ここで、より多くのパラメーターを指定してこれを実行すると、次のようになります。

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」パラメーターとして使用され、ブール値フラグであることを示します。
  • 他のパラメータはすべて追加の値を取ります
  • 値を取るパラメーターが複数の値を受け入れることができる場合、それをリストとして宣言できます (追加アクションを使用)。
  • すべてのパラメーターが処理された後も、「args」変数を介して使用できる追加のコマンド ライン パラメーターが残っています。

詳細については、http://jython.org/docs/library/optparse.htmlをご覧ください。

于 2014-01-21T15:05:07.130 に答える