2010-10-24 4 views
1

ma version python est 2.4.3.comment implémenter les options/arguments pour les fonctions de ligne de commande en python

Maintenant, je développe un CLI avec le module cmd de python pour un lecteur CD. J'ai quelques classes comme CDContainer (avec la méthode comme addCD, removeCD, etc), CD (avec la méthode aiment jouer, arrêt, pause). Maintenant, je veux ajouter quelques options pour les commandes et aussi si les entrées d'options ne sont pas correctes, l'interface de ligne de commande pourrait renvoyer des informations correctes sur le mauvais type d'entrée ou les mauvaises valeurs. Par exemple, je veux avoir "addcd --track 3 - thriller de nom de domaine". ce que je fais maintenant est d'obtenir tous les arguments via, le diviser, et l'assigner aux variables pertinentes, comme suit.

ma question est en python, y a-t-il un module qui est pratique pour analyser et analyser les options ou les arguments dans mon cas?

REVISION: OK, je l'édite, grâce aux commentaires de gclj5.

import cmd 
class CDContainerCLI(cmd.Cmd): 

    def do_addcd(self, line): 
     args=line.split() 
     parser = OptionParser() 
     parser.add_option("-t", "--track", dest="track_number", type="int", 
      help="track number") 
     parser.add_option("-n", "--cdname", dest="cd_name", type="string", 
      help="CD name") 
     (options, positional_args) = parser.parse_args(args) 
     cd_obj= CD() 
     cd_obj.addCD(options.track_number, options.cd_name) 

Si possible, pourriez-vous écrire des exemples de code, juste pour montrer comment le faire?

Merci beaucoup !!

Répondre

3

Selon votre version de Python, vous devriez jeter un oeil à optparse (depuis la version 2.3, obsolète depuis la version 2.7) ou argparse (depuis la version 2.7).

Quelques exemples de code utilisant optparse (line est la chaîne que vous lisez dans votre entrée standard CLI):

from optparse import OptionParser 

args = line.split() 

parser = OptionParser() 
parser.add_option("-t", "--track", dest="track_number", type="int", 
        help="track number") 
parser.add_option("-n", "--cdname", dest="cd_name", type="string", 
        help="CD name") 

# args[0] contains the actual command ("addcd" in this example). 
(options, positional_args) = add_cd_parser.parse_args(args[1:]) 

if options.track_number != None and options.cd_name != None: 
    cd_obj= CD() 
    cd_obj.addCD(options.track_number, options.cd_name) 
    print "add CD (track %d, name %s)" % (options.track_number, options.cd_name) 

Cet analyseur ne gère que votre commande "addcd". Pour plus de commandes, vous pouvez utiliser plusieurs objets OptionParser dans un dictionnaire avec le nom de la commande comme clé, par exemple. Vous pouvez analyser les options comme suit:

(options, args) = parsers[args[0]].parse_args(args[1:]) 

Consultez la documentation d'optparse pour plus d'informations. Il est très facile de générer des informations d'utilisation, par exemple. Il y a aussi un tutorial disponible.

+0

salut, gclj5, merci pour votre réponse. J'utilise 2.4.3. J'ai entendu parler de cette optparse, mais je ne sais pas comment l'utiliser avec mon code. par exemple. comment pourrais-je l'intégrer dans la fonction addcd? où et comment devrais-je l'ajouter? – pepero

+0

Je ne connais pas la structure exacte de votre programme, donc je ne peux pas vous dire exactement où l'ajouter. Mais j'ai ajouté quelques exemples de code pour illustrer l'utilisation du paquet optparse. L'idée générale serait de laisser le code d'analyse CLI appeler les fonctions correspondantes avec les options analysées. – gclj5

+0

Salut, gclj5, merci beaucoup pour votre code.c'est args [0:], pas args [1:], parce que, les args sont pris comme entrée pour la méthode. Je révise le code de mon message original. mais il y a encore un problème. Quand il y a quelques exceptions (mauvais type ou option manquante), cette optionparse va quitter pour le programme entier, au lieu de sortir juste pour la méthode appropriée. comment pourrions-nous résoudre cela? – pepero

3

ma question est en python, y a-t-il un module qui est pratique pour analyser et analyser les options ou les arguments dans mon cas?

Oui, le argparse module.

Si vous êtes déjà familier avec la bibliothèque getopt de C, that's also available as a python module - bien que moins facile à utiliser, si vous n'êtes pas déjà habitué.

1

Voici un script de démonstration que j'ai écrit il y a quelques mois lorsque mes collègues et moi-même avons appris le module argparse. Il illustre plusieurs comportements et caractéristiques du module:

import sys 
import argparse 

def parse_command_line(): 
    # Define our argument parser. 
    ap = argparse.ArgumentParser(
     description = 'This is a demo app for the argparse module.', 
     epilog  = 'This text will appear after options.', 
     usage  = '%(prog)s [options]', # Auto-generated by default. 
     add_help = False,     # Default is True. 
    ) 

    # A grouping of options in the help text. 
    gr = ap.add_argument_group('Required arguments') 

    # A positional argument. This is indicated by the absense 
    # of leading minus signs. 
    gr.add_argument(
     'task', 
     choices = ['get', 'put'], 
     help = 'Task to be performed.', # Help text about an option. 
     metavar = 'TASK', # Placeholder to be used in an option's help text. 
          # The default in this case would be "{get,put}". 
    ) 

    # Another group. 
    gr = ap.add_argument_group('Common options') 

    # A basic option. 
    gr.add_argument(
     '-s', '--subtask', 
     action = 'store', # This is the default. 
          # One value will be stored, as a string, 
          # in opt.subtask 
    ) 

    # A required option, with type conversion. 
    gr.add_argument(
     '-u', '--user', 
     required = True, # Options can be made mandatory. 
         # However, positional arguments can't be made optional. 
     type = int,  # Convert opt.user to an integer. 
         # By default, it would be a string. 
    ) 

    # A flag option. 
    gr.add_argument(
     '--overwrite', 
     dest = 'clobber',  # Store in opt.clobber rather than opt.overwrite. 
     action = 'store_true', # If option is supplied, opt.clobber == True. 
    ) 

    # Another group. 
    gr = ap.add_argument_group('Some other options') 

    # An option with multiple values. 
    gr.add_argument(
     '--datasets', 
     metavar = 'DATASET', # Default would be DATASETS. 
     nargs = '+', # If option is used, it takes 1 or more arguments. 
         # Will be stored as a list in opt.datasets. 
     help = "The datasets to use for frobnication.", 
    ) 

    # An option with a specific N of values. 
    gr.add_argument(
     '--bar', 
     nargs = 1, # Takes exactly one argument. Differs from a basic 
         # option because opt.bar will be a list rather 
         # than a string. 
     default = [], # Default would be None. 
    ) 

    # A file option. 
    gr.add_argument(
     '--log', 
     type = argparse.FileType('w'), # Will open a file for writing. 
     default = sys.stdout, 
     help = 'Log file (default: STDOUT)', 
    ) 

    # Another group. 
    gr = ap.add_argument_group('Program information') 

    # A version option. 
    gr.add_argument(
     '-v', '--version', 
     action = 'version', # Will display version text and exit. 
     version = 'argparse_demo v1.2.0', # The version text. 
    ) 

    # A help option. 
    gr.add_argument(
     '-h', '--help', 
     action = 'help', # Will display help text and exit. 
    ) 

    # Parse the options. 
    # If given no arguments, parse_args() works with sys.argv[1:]. 
    # And the object it returns will be of type Namespace. 
    opt = ap.parse_args() 

    return opt 

command_lines = [ 
    'argparse_demo.py put -u 1', 
    'argparse_demo.py get -u 234 --over --data a b c --bar XYZ -s munch --log _log.txt', 
    'argparse_demo.py -h', # Will exit() here. 
] 

for c in command_lines: 
    sys.argv = c.split() 
    opt = parse_command_line() 
    print opt 
Questions connexes