转:python的命令行输入参数

转自:http://blog.sina.com.cn/s/blog_70ac7daa0100x0kp.html

 

opts, args = getopt.getopt(sys.argv[1:], "t:s:h", ["walletype=", "servicename=",'help'])
for a,o in opts:
    if a in ('-t', '--walletype'):
        walle_type = o
    elif a in ('-s', '--servicename'):
        service_name = o
    elif a in ('-h', '--help'):
         help = True

其中t:s:h表示参数的缩写,:表示参数后需要传值

walletype=,servicename=,help表示参数的全称,=表示后面需要传值 

 

首先,
import getopt
import sys
然后,
opts,args=getopt.getopt(sys.argv[1:],"hi:l:",["help", "interval=","list="])

1.使用的是getopt中的函数getopt(),其中有三个输入参数。第一个参数sys.argv是程序输入的以逗号分隔的全部参数列表(字符串列 表),与c语言类似,sys.argv[0]是程序名,因此有效地输入参数是从第二个开始,因此这里写成sys.argv[1:],即除程序的所有输入内 容列表.
2.第二个参数是短格式参数定义部分.当一个选项后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":"号。上例中表明,参数-h,后面无附加参数,而-i和-l后面必须接续一个附加参数.
3.第三个参数用来定义长格式.该参数是可选的.该列表中的参数如果后面需要跟附加参数写成形如"list=",即有"=",其功能相当于上一项中的":",否则进写出参数名如"help"即可.
4.getopt函数返回两个列表:opts和args。opts为分析出的格式信息。args为不属于格式信息的剩余的命令行参数。opts是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数则为空串''。
例如 输入 pyname -i 10 -l c p wn
其中 pyname 代表程序的文件名, 则程序调用getopt后返回的列表值为:
opts : [('-i', '10'), ('-l', 'c')]
args : ['p', 'wn']

 

如果, 输入 pyname -i -l c p wn, 则
opts: 

[('-i', '-l')]
args:  ['c', 'p', 'wn']
可见由于定义-i后面有附加参数,getopt将把-i之后紧挨着的参数是为其附加参数作为对应元组的第二项内容.这是进行参数解析处理中需要特别注意的地方.

如果, 输入-h, -i, -l以外的参数时,getopt会异常返回,而非想象中的也将对应的参数写进opts列表中.
再如, 输入 pyname -i, getopt也会异常返回.
这样程序变得不可控,怎么办? 所以,需要对上面的使用方法进行改造:

try:
     opts,args=getopt.getopt(sys.argv[1:],"hi:l:",["help", "interval=","list="])
except getopt.GetoptError:
      print "Error "#info as you want to give out
      sys.exit()
[...]# 对附加参数的进一步分析处理.即输入参数在语法意义上合法,但不一定在语义意义上合法.例如
for opt,value in opts:
 
  if opt == "-i":
      if not(value.isdigit()):#-i后面的附加参数应该是数字
          print "after -i, should be integer "
          sys.exit()
      else:
          interval=int(value)
   [...]

补充:如果你觉得输出的异常错误信息提示不够好,或者你发现在不加except之前,getopt.GetoptError自动输出的错误是你想要的怎么办?
将except 分支简单修改一下:

except getopt.GetoptError as e:
    print e.msg
    sys.exit()
如此,就不用自己在except分支下分各种情况进行处理了。

 

posted on 2015-05-10 21:04  isen1988  阅读(4466)  评论(0编辑  收藏  举报

导航