2013-04-03 1 views
0

J'utilise optparse pour ajouter des options au script Jython. Ils sont commeAjout de sous-options à l'aide d'optparse dans Jython

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

ainsi de suite, maintenant ma question est de savoir comment puis-je ajouter des sous-options à une certaine option ,, comme

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

car il peut y avoir beaucoup d'options et je ne peux pas valider ou fournir une aide par capturer toutes les options à un seul niveau. Et j'ai trouvé quelques scripts il y a des options comme

$script.py -start --help 

-> cela donnera seulement des options qui peuvent être donnés aux parents « start » option. Alors, s'il vous plaît aidez-moi comment puis-je obtenir cette

Merci, Chakri

Répondre

0

Il n'y a aucun moyen d'ajouter des options « sous ». Généralement, une option d'aide est faite par quelque chose comme $script.py --help start - où start est juste une option de chaîne que vous lisez et affichez les informations appropriées.

0

J'ai eu le même problème récemment. La solution qui a fonctionné pour moi était la suivante:

  • comme convention, utilisez le premier argument pour représenter la commande vous voulez à execute (ce serait votre start, clear, stop)

  • obtenir cette commande par sys.argv[1] (je sais que c'est une solution de contournement laid)

  • créer plusieurs optparse.OptionParser() (un pour chaque commande)

  • Invoke seule la méthode parse_args() du OptionParser approprié

  • en cas de commande non valide ou manquant, créez un autre analyseur option pour afficher l'utilisation

Voici un exemple de code:

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

ici som e résultats:

[[email protected] ~]$ 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 

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

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

[[email protected] ~]$ python parse.py clear 
Args = ['clear'] 
Options = {'foo': None} 

[[email protected] ~]$ 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 
[[email protected] ~]$ python parse.py stop -- help 
Args = ['stop', 'help'] 
Options = {'type': None, 'name': None} 

[[email protected] ~]$ 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 
+0

** Note **: Utilisation * optparse * est déconseillée depuis la version python 2.7. Le module optparse est obsolète et ne sera pas développé davantage; le développement se poursuivra avec le module * argparse *. Voir [PEP 0389] (http://www.python.org/dev/peps/pep-0389/) pour plus d'informations. – shakaran

0

C'est exactement ce que propose OptionParser!

Consultez le code suivant:

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

Si vous exécutez ce avec un -h (ou --help) vous obtenez les éléments suivants:

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 

Maintenant, si nous courons cela avec plus de paramètres, à savoir:

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

nous obtenons la sortie montré:

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

note quelques petites choses:

  • L'ordre des paramètres sur la ligne de commande n'a pas d'importance (tant que les paramètres sont fournis avec leurs indicateurs associés)
  • L'option -d dans ce cas est utilisée comme paramètre "store_true", pour indiquer qu'il s'agit d'un indicateur booléen
  • Les autres paramètres prennent toutes les valeurs supplémentaires
  • Si un paramètre qui prend une valeur peut accepter plus d'une valeur, vous pouvez le déclarer comme une liste (en utilisant l'action append)
  • Une fois que tous les paramètres ont été traités, vous avez toujours des paramètres de ligne de commande supplémentaires disponibles via la variable 'args'.

Pour plus d'informations, s'il vous plaît jeter un oeil à http://jython.org/docs/library/optparse.html

+0

Note - en réponse à shakaran (je ne peux pas répondre à ce commentaire, pour une raison quelconque!) - Je ne suis pas sûr que le module argparse est actuellement disponible pour Jython. –