了解OptionParser

时间:2011-02-10 18:00:50

标签: python optparse 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. 如果脚本没有提供选项,它将打印“没有给出选项!! ”。
  5. 这些可行吗?我确实访问了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. 使用ONLY -v选项运行脚本,只返回option.vos [根本不工作]
    4. 使用-m和-v选择运行脚本,将执行不同的操作[尚未达到目的]
    5. 当我使用-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 个答案:

答案 0 :(得分:3)

optparse已被弃用;你应该在python2和python3

中使用argparse

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

答案 1 :(得分:2)

您的解决方案对我来说很合理。评论:

  • 我不明白你为什么把month_abbr变成一个元组;没有tuple()
  • ,它应该可以正常工作
  • 我建议您检查无效月份值(raise OptionValueError如果发现问题)
  • 如果您真的希望用户输入" 01"," 02",...或者#34; 12",您可以使用&# 34;选择"选项类型;见option types documentation

答案 2 :(得分:1)

只是为了说明argparse.ArgumentParser的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)