понимание OptionParser - PullRequest
       58

понимание OptionParser

10 голосов
/ 10 февраля 2011

Я пытался 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. Будет напечатано " Никаких опций не было дано !! " ТОЛЬКО если никакие опции не включены в скрипт.

Это выполнимо? Я действительно посетил сайт 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 [ работает ]
  2. запустить скрипт с параметром -m с возвратом option.mon [ работает ]
  3. запустить скрипт с опцией ТОЛЬКО -v, ТОЛЬКО вернет option.vos [ вообще не работает ]
  4. Запустите сценарий с опциями -m и -v, сделайте другое [, чтобы добраться до точки ]

Когда я запускаю скрипт с параметром only -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'

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

Ответы [ 3 ]

3 голосов
/ 03 июня 2011

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

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

2 голосов
/ 11 мая 2014

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

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

Просто, чтобы проиллюстрировать опцию выбора в 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)
...