python 处理命令行参数

http://blog.chinaunix.net/uid-20786165-id-3182268.html

标题写了那么久,现在现在才有时间,整理下自己的思路。首先先总结下自己对sys模块的理解。手册上对sys的描述是系统参数和系统函数,这里的系统实际上是python解释器。这个模块提供了用户可以访问的解释器变量和一些可以与解释器进行交互的功能函数。这里主要关注的就是sys.argv,其实它就是一个解释器变量,通过sys模块,我们就可以访问,并且根据自己的需要来解析。


sys.argv

描述:记录命令行参数
类别:列表(可以使用列表方法来访问)
我用的系统是RHL 5.3,python 版本为2.4,写了个测试程序PyTest.py来观察python解释器调用时,sys.agrv的元素的值:
#!/usr/bin/env python

import sys

def main(argv):
    for arg in argv:
        print arg
if __name__ == '__main__':
    main(sys.argv)

那我们开始调用测试脚本:
  1. python PyTest.py 输出结果:PyTest.py, 原始列表为['PyTest.py']
  2. python PyTest.py -c 0 a:1:b 输出结果为:PyTest.py -c 0 a:1:b。说明解释器是以空格或者制表符来区分参数。
  3. python /root/python_scripts/PyTest.py 输出结果为:/root/python_scripts/PyTest.py。记录的是绝对路径。
  4. chmod +x PyTest.py;./PyTest.py 输出结果为:./PyTest.py
  5. /root/python_scripts/PyTest.py 输出结果为:/root/python_scripts/PyTest.py
注:说明sys.argv[0]保存的是可执行程序名,后面是命令行参数,以空格为区分点。

C语言风格的命令行解析模块getopt


这个支持短命令(-a)和长命令模式(--add)。getopt的调用方式为:getopt.getopt(args, 'hvo:')或者getopt.getopt(args,'hvo:', ['help', 'version', 'output=']),如果只使用长命令,短命令参数必须是个空字符串。:表示参数后必须有参数,=表示长命令后必须有参数。
示例代码:
#!/usr/bin/env python

import sys
import getopt

def Usage():
    print 'PyTest.py usage:'
    print '-h,--help: print help message.'
    print '-v, --version: print script version'
    print '-o, --output: input an output verb'
    print '--foo: Test option '
    print '--fre: another test option'
def Version():
    print 'PyTest.py 1.0.0.0.1'
def OutPut(args):
    print 'Hello, %s'%args
def main(argv):
    try:
        opts, args = getopt.getopt(argv[1:], 'hvo:', ['output=', 'foo=', 'fre='])
    except getopt.GetoptError, err:
        print str(err)
        Usage()
        sys.exit(2)
    for o, a in opts:
        if o in ('-h', '--help'):
            Usage()
            sys.exit(1)
        elif o in ('-v', '--version'):
            Version()
            sys.exit(0)
        elif o in ('-o', '--output'):
            OutPut(a)
            sys.exit(0)
        elif o in ('--foo',):
            Foo=a
        elif o in ('--fre',):
            Fre=a
        else:
            print 'unhandled option'
            sys.exit(3)

if __name__ == '__main__':
    main(sys.argv)

19行: 调用函数时返回两个列表, 第一个列表保存参数和值的元组集合,第二个列表保存其他值,不在参数指定的所有值。
[root@node5 python_scripts]# ./PyTest.py --f
option --f not a unique prefix
PyTest.py usage:
-h,--help: print help message.
-v, --version: print script version
-o, --output: input an output verb
--foo: Test option 
--fre: another test option
[root@node5 python_scripts]# ./PyTest.py --fo
option --foo requires argument
PyTest.py usage:
-h,--help: print help message.
-v, --version: print script version
-o, --output: input an output verb
--foo: Test option 
--fre: another test option
这两个调用过程可以看到getopt可以进行唯一匹配。
[root@node5 python_scripts]# ./PyTest.py -h -v
PyTest.py usage:
-h,--help: print help message.
-v, --version: print script version
-o, --output: input an output verb
--foo: Test option 
--fre: another test option
[root@node5 python_scripts]# ./PyTest.py -v -h
PyTest.py 1.0.0.0.1
这里可以看到解析顺序从前向后。
[root@node5 python_scripts]# ./PyTest.py -o a --output ab
Hello, a
[root@node5 python_scripts]# ./PyTest.py --output ab -o a
Hello, ab
这里可以看到实际上-o和--output是分开处理的。
从这里我们可以总结下getopt的特点:
1 getopt是从前到后解析
2 getopt不检查额外参数的合法性,需要自行检查
3 短命令行和长命令行是分开解析的。
稍后完善

optparse

模块optparse提供了OptionParser用来解析命令行,optparse在2.3引进,2.7弃用,2.7以后用argparse替代。
OptionParser将自动生成帮助信息。
OptionParser的使用过程

from optparse import OptionParser
导入OptionParser。

parser = OptionParser()
生成OptionParser的一个实例

parser.add_option('c', 'clear', dest='clear_option', default=False, action='store_true', help = 'Clean origin configurations and databases.')
添加命令行选项

(options, args) = parser.parse_args(sys.argv[1:])
解析命令行

options.clear_option 使用命令行。
python 创建目录
os.mkdir()  创建一个非递归目录
os.makedirs() 创建一个递归目录


optparse是专门用来在命令行添加选项的一个模块。

首先来看一段示例代码

from optparse import OptionParser

MSG_USAGE = "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]"

optParser = OptionParser(MSG_USAGE)

optParser.add_option("-f","--file",action = "store",type="string",dest = "fileName")

optParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg',

                     help="make lots of noise [default]")

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print options.fileName

print options.verbose

print options

print args

print optParser.print_help()

 

示例代码首先添加解析选项,然后解析目标字符串数组fakeArgs,最后5行输出。

输出结果为:

file.txt
False
{'verbose': False, 'fileName': 'file.txt'}
['good luck to you', 'arg2', 'arge']
Usage: myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]

Options:
  -h, --help            show this help message and exit
  -f FILENAME, --file=FILENAME
  -v, --vison           make lots of noise [default]

print options的输出结果为第3行({'verbose': False, 'fileName': 'file.txt'})

print args的输出结果为第4行(['good luck to you', 'arg2', 'arge'])

print optParser.print_help()的输出结果从Usage这一行到最后。


基本使用步骤

1、 产生一个OptionParser的物件optParse。传入的值MSG_USAGE可被调用打印命令时显示出来。

MSG_USAGE = "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]"

optParser = OptionParser(MSG_USAGE)

2、 调用OptionParser.add_option()添加选项

optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName")

optParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg',

                     help="make lots of noise [default]")

add_option()参数说明:

   action:存储方式,分为三种storestore_falsestore_true

   type:类型(我也不知道什么的类型)

   dest:存储的变量

   default:默认值

   help:帮助信息

3、 调用OptionParser.parse_args()剖析并返回一个directory和一个list

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print options.fileName

print options.verbose

print options

print args

输出结果

file.txt
False
{'verbose': False, 'fileName': 'file.txt'}
['good luck to you', 'arg2', 'arge']

parse_args() 说明 :

   如果没有传入参加,parse_args会默认将sys.argv[1:]的值作为默认参数。这里我们将   fakeArgs模拟输入的值。

从返回结果中可以看到,

  options为是一个directory,它的内容fakeArgs为“参数/值 ”的键值对。

  args 是一个list,它的内容是fakeargs除去options后,剩余的输入内容。

  options.versionoptions.fileName都取到与options中的directory的值。

4、 调用OptionParser.optParser.print_help()输出帮助信息

optParser.print_help()

   显示返回结果

Usage: myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]

Options:

  -h, --help            show this help message and exit

  -f FILENAME, --file=FILENAME

  -v, --vison           make lots of noise [default]

optParser.print_help()说明:

1、最开始的的MSG_USAGE的值:在这个地方显示出来了。

2、自动添加了-h这个参数。

     注:在MSG_USAGE中如果使用%prog,会被自动解析为sys.args[0] 也就是文件名。如将,MSG_USAGE = "%prog [options] arg1 arg2",假如文件名为   filexx,那么出现在help中的

信息就是" filexx[options] arg1 arg2"



深入分析

OptionParser.add_option()

例:optParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg',

                     help="make lots of noise [default]")

参数action:

存储方式,分为三种storestore_falsestore_true

下面分别对三种方式进行说明:


第一种:action = "store"

1、如果输入的参数fakeArgs中存在"-v",则verbose返回的值为fakeArgs中的紧跟'-v'的数,即"good luck to you"。这也正好options中的键值对应,剩下配对的参数都传给了args。请见以下代码

optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName")

optParser.add_option("-v","--vison", action="store", dest="verbose")

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print optParse.verbose

print options

print args

输入结果

good luck to you

{'verbose': 'good luck to you', 'fileName': 'file.txt'}

['arg2', 'arge']


2、如果输入的参数fakeArgs中不存在"-v",verbose的返回值为None

示例代码:

optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName")

optParser.add_option("-v","--vison", action="store", dest="verbose")

fakeArgs = ['-f','file.txt','good luck to you', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print optParse.verbose

print options

print args

输出结果

None

{'verbose': None, 'fileName': 'file.txt'}

['good luck to you', 'arg2', 'arge']


第二种:action = "store_true"

1fakeArgs中存在'-v'verbose将会返回True而不是"good luck to you"。意思就是说verbose的值与'-v'

的后一位无关,只与'-v'存不存在就关。

示例代码

optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName")

optParser.add_option("-v","--vison", action="store_true", dest="verbose")

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print optParse.verbose

print options

print args

输出结果

True

{'verbose': True, 'fileName': 'file.txt'}

['good luck to you', 'arg2', 'arge']


2、fakeArgs中不存在'-v'verbose同样返回空(我就不运行代码了)。

第三种:action="store_false"

这与action="store_true"类似,只有其中有参数'-v'存在,则verbose的值为False,如果'-v'不存在,那么verbose的值为None



参数:default

optParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg'

设置些参数是用于返回verbose的返回值。

如果action="store"default='gggggg',代码如下。

optParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg'

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']

如果fakeArgs中存在'-v',则返回值为,"good luck to you"

如果不存在'-v'则返回值为,"gggggg"

如果action ="store_true",default='gggggg',代码如下。

optParser.add_option("-v","--vison", action="store_true", dest="verbose",default='gggggg'

如果fakeArgs中存在'-v',则返回值为True

如果fakeArgs中不存在'-v',则返回值为None

再一次说明了,如果action="store_true"时,verbose的值只与是否'-v'有关。是否也说明了action_true的优先级高于default

注:action="store_false"的功能与此类似,返回为False或者None。再一次证明了



参数:help

optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName")

optParser.add_option("-v","--vison", action="store", dest="verbose",default='gggggg',

                     help="make lots of noise [default]")

主要用于显示帮助信息,使用optParser.print_help()将帮助栏显示出来。

action="restore"时对比没使用help参数的'-f'与使用了help参数的'-v',多了一行帮助信息。

Usage: myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]

Options:

  -h, --help            show this help message and exit

  -f FILENAME, --file=FILENAME

  -v VERBOSE, --vison=VERBOSE

                        make lots of noise [default]

action="restore_false"时。

optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName")

optParser.add_option("-v","--vison", action="store", dest="verbose",default='gggggg',

                     help="make lots of noise [default]")

两个对比的输出结果如下

Usage: myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]

Options:

  -h, --help            show this help message and exit

  -f FILENAME, --file=FILENAME

  -v, --vison           make lots of noise [default]



参数:type

  没有仔细测试,但知道一点时如果type="string"时,将无法使用action="store_false"action="store_true"。不知是否可以将type理解成verbose的返回值类型。

关于输入的的参数fakeArgs的说明

还是用之前的代码分析

from optparse import OptionParser

MSG_USAGE = "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]"

optParser = OptionParser(MSG_USAGE)

optParser.add_option("-f","--file",action = "store",type="string",dest = "fileName")

optParser.add_option("-v","--vison", action="store", dest="verbose",default='gggggg',

                     help="make lots of noise [default]")

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print options

print args

fakeArgs中的值对于各选项'-v','-f'来说都是前后两个值配对的。

1、正常情况:

结果如下

options的值为:     {'verbose':'good luck to you', 'fileName': 'file.txt'}

args的值为:           ['arg2', 'arge']


2、不正常情况:

如果连续出现两个选项'-f','-v'

fakeArgs = ['-f','-v','good luck to you', 'arg2', 'arge']

'-v'作为值传给了fileName

verbose返回的是默认值'gggggg',如果没设置将会返回None。换句说话,就是没检测到参数'-v'的存在,这也再一次说明了,fakeArgs中键值配对的观念。前一个数作为选项,后一个作为值。

结果如下:

options的值为:     {'verbose':'gggggg', 'fileName': '-v'}

args的值为:           ['good luck to you','arg2', 'arge']

3、如果多出一个'x'未被定义则程序会报错。

fakeArgs = ['-x','-f','file.txt','-v','good luck to you', 'arg2', 'arge']

好了,关于optParse这个模块就只学到了这些东西。


http://write.blog.csdn.net/postedit/20727791


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值