как реализовать опции / аргументы для функций командной строки в Python - PullRequest
1 голос
/ 24 октября 2010

моя версия на питоне 2.4.3.

Сейчас я разрабатываю CLI с модулем cmd из python для проигрывателя компакт-дисков. У меня есть некоторые классы, такие как CDContainer (с такими методами, как addCD, removeCD и т.д.), CD (с такими методами, как play, stop, pause). Теперь я хочу добавить некоторые параметры для команд, а также, если входные параметры не верны, CLI может вернуть правильную информацию о неправильном типе ввода или неправильных значениях. например, я хочу иметь «триллер addcd --track 3 --cdname». то, что я делаю сейчас, это чтобы получить все аргументы, разделить их и присвоить соответствующим переменным следующим образом.

мой вопрос в Python, есть ли какой-нибудь модуль, который пригодится для моего случая для анализа и анализа опций или аргументов?

ПЕРЕСМОТР: ОК, я редактирую его, благодаря комментариям 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)

Если возможно, не могли бы вы написать несколько примеров кода, просто чтобы показать, как это сделать?

Большое спасибо !!

Ответы [ 3 ]

3 голосов
/ 24 октября 2010

В зависимости от вашей версии Python, вы должны взглянуть на optparse (начиная с версии 2.3, устарело начиная с версии 2.7) или argparse (начиная с версии 2.7).

Некоторые примеры кода с использованием optparse (line - это строка, которую вы читаете из stdin в вашем 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)

Этот анализатор обрабатывает только вашу команду "addcd".Для большего количества команд вы можете использовать несколько OptionParser объектов в словаре, например, с именем команды в качестве ключа.Вы можете разобрать параметры, как это тогда:

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

Посмотрите документацию для optparse для получения дополнительной информации.Например, очень легко вывести информацию об использовании.Также доступно учебное пособие .

3 голосов
/ 24 октября 2010

мой вопрос в Python, есть ли какой-нибудь модуль, который удобен для моего случая для анализа и анализа опций или аргументов?

Да, модуль argparse .

Если вы уже знакомы с библиотекой getopt из C, она также доступна в виде модуля python - хотя и менее проста в использовании, если вы еще не привыкли к ней.

1 голос
/ 24 октября 2010

Вот демонстрационный скрипт, который я написал несколько месяцев назад, когда мы с коллегами изучали модуль argparse .Он иллюстрирует несколько поведений и функций модуля:

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
...