понимание OptionParser

Я пробовал optparse и это мой первоначальный сценарий.

 #!/usr/bin/env python import os, sys from optparse import OptionParser parser = OptionParser() usage = "usage: %prog [options] arg1 arg2" parser.add_option("-d", "--dir", type="string", help="List of directory", dest="inDir", default=".") parser.add_option("-m", "--month", type="int", help="Numeric value of the month", dest="mon") options, arguments = parser.parse_args() if options.inDir: print os.listdir(options.inDir) if options.mon: print options.mon def no_opt() print "No option has been given!!" 

Теперь это то, что я пытаюсь сделать:

  1. Если аргумент не задан с параметром, он примет значение «по умолчанию». т.е. myScript.py -d просто перечислит текущий каталог или -m без какого-либо аргумента, в качестве аргумента возьмет текущий месяц.
  2. Для «-month» допускается только от 01 до 12 в качестве аргумента
  3. Хотите объединить несколько вариантов для выполнения разных задач, т.е. myScript.py -d this_dir -m 02 будет делать что-то другое, чем -d и -m как индивидуальное.
  4. Он будет печатать « No option is given !! » ТОЛЬКО, если в сценарий нет опции.

Являются ли они выполнимыми? Я посетил сайт doc.python.org для получения возможных ответов, но как начинающий питон, я потерял себя на страницах. Он очень ценит вашу помощь; заранее спасибо. Ура !!


Обновление: 16/01/11

Кажется, я все еще что-то упускаю. Это сейчас в моем скрипте.

 parser = OptionParser() usage = "usage: %prog [options] arg1 arg2" parser.add_option("-m", "--month", type="string", help="select month from 01|02|...|12", dest="mon", default=strftime("%m")) parser.add_option("-v", "--vo", type="string", help="select one of the supported VOs", dest="vos") options, arguments = parser.parse_args() 

Это моя цель:

  1. запустить скрипт без какой-либо опции, вернет option.mon [ working ]
  2. запустите скрипт с параметром -m, с возвратом option.mon [ working ]
  3. запустите скрипт с опцией ONLY -v, ТОЛЬКО вернет option.vos [ вообще не работает ]
  4. запустить скрипт с -m и -v opting, будет делать другую вещь [ еще не добравшись до точки ]

Когда я запускаю скрипт только с параметром -m, он сначала печатает option.mon а затем option.vos , чего я вообще не хочу. Очень ценю, если кто-то может поставить меня в правильном направлении. Ура !!


3-е обновление

  #!/bin/env python from time import strftime from calendar import month_abbr from optparse import OptionParser # Set the CL options parser = OptionParser() usage = "usage: %prog [options] arg1 arg2" parser.add_option("-m", "--month", type="string", help="select month from 01|02|...|12", dest="mon", default=strftime("%m")) parser.add_option("-u", "--user", type="string", help="name of the user", dest="vos") options, arguments = parser.parse_args() abbrMonth = tuple(month_abbr)[int(options.mon)] if options.mon: print "The month is: %s" % abbrMonth if options.vos: print "My name is: %s" % options.vos if options.mon and options.vos: print "I'm '%s' and this month is '%s'" % (options.vos,abbrMonth) 

Это то, что возвращает скрипт при запуске с различными параметрами:

 # ./test.py The month is: Feb # # ./test.py -m 12 The month is: Dec # # ./test.py -m 3 -u Mac The month is: Mar My name is: Mac I'm 'Mac' and this month is 'Mar' # # ./test.py -u Mac The month is: Feb My name is: Mac I'm 'Mac' and this month is 'Feb' 

Мне нравится только:

  1. `I'm 'Mac' and this month is 'Mar'` - as *result #3* 2. `My name is: Mac` - as *result #4* 

Что я делаю не так? Ура !!


4-е обновление:

Отвечая самому себе: таким образом я могу получить то, что я ищу, но я все равно не впечатлен.

 #!/bin/env python import os, sys from time import strftime from calendar import month_abbr from optparse import OptionParser def abbrMonth(m): mn = tuple(month_abbr)[int(m)] return mn # Set the CL options parser = OptionParser() usage = "usage: %prog [options] arg1 arg2" parser.add_option("-m", "--month", type="string", help="select month from 01|02|...|12", dest="mon") parser.add_option("-u", "--user", type="string", help="name of the user", dest="vos") (options, args) = parser.parse_args() if options.mon and options.vos: thisMonth = abbrMonth(options.mon) print "I'm '%s' and this month is '%s'" % (options.vos, thisMonth) sys.exit(0) if not options.mon and not options.vos: options.mon = strftime("%m") if options.mon: thisMonth = abbrMonth(options.mon) print "The month is: %s" % thisMonth if options.vos: print "My name is: %s" % options.vos 

и теперь это дает мне именно то, что я искал:

 # ./test.py The month is: Feb # ./test.py -m 09 The month is: Sep # ./test.py -u Mac My name is: Mac # ./test.py -m 3 -u Mac I'm 'Mac' and this month is 'Mar' 

Это единственный способ сделать это? Не выглядит «лучшим способом» для меня. Ура !!

  • Как установить красивый суп 4 с python 2.7 на окна
  • Python join: почему это string.join (list) вместо list.join (string)?
  • Почему (1 в == Истина) оценивается в False?
  • Python: сделать eval safe
  • Как экспортировать std :: vector
  • Регистрация пользователей с сайта Django после N минут бездействия
  • Передача загрузки Linux выбирает Init
  • Распределение целых чисел с использованием весов? Как рассчитать?
  • 3 Solutions collect form web for “понимание OptionParser”

    Ваше решение выглядит разумным для меня. Комментарии:

    • Я не понимаю, почему вы превращаете month_abbr в кортеж; он должен работать нормально без tuple()
    • Я бы рекомендовал проверить значение недопустимого месяца ( raise OptionValueError если вы обнаружите проблему)
    • если вы действительно хотите, чтобы пользователь вводил точно «01», «02», … или «12», вы могли бы использовать тип опции «выбор»; см. документацию по типам

    optparse устарел; вы должны использовать argparse как в python2, так и в python3

    http://docs.python.org/library/argparse.html#module-argparse

    Просто, чтобы проиллюстрировать выбор – вариант argparse.ArgumentParser's add_argument () – метод:

     #!/usr/bin/env python # -*- coding: utf-8 -*- import sys from argparse import ArgumentParser from datetime import date parser = ArgumentParser() parser.add_argument("-u", "--user", default="Max Power", help="Username") parser.add_argument("-m", "--month", default="{:02d}".format(date.today().month), choices=["01","02","03","04","05","06", "07","08","09","10","11","12"], help="Numeric value of the month") try: args = parser.parse_args() except: parser.error("Invalid Month.") sys.exit(0) print "The month is {} and the User is {}".format(args.month, args.user) 
    Python - лучший язык программирования в мире.