1.sys.argv[]

sys.argv可以看成是一个获取了全部外部参数的一个列表,所以可以用[]来提取其中的元素。其中第一个元素是脚本名,随后才依次是外部给予的参数,并且读取进来的默认是字符串格式。

如果脚本很简单或临时使用,没有多个复杂的参数选项时,可以利用此模块函数。

2.argparse模块

一般情况下,脚本可能需要多个参数,而且每次参数的类型用处各不相同,那么这个时候在参数前添加标签表明参数的类型和用途是十分必要的。而利用argparse模块即可实现这一目的。

一、使用步骤:

1:import argparse

2:parser = argparse.ArgumentParser()

3:parser.add_argument()

4:parser.parse_args()

解释:首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用,下面简单说明一下步骤2和3。

 

二、方法ArgumentParser(prog=None,usage=None,description=None,epilog=None,parents=[],

formatter_class=argparse.HelpFormatter,prefix_chars='',fromfile_prefix_chars=None,argument_default=None,conflict_handler='error', add_help=True)

         prog=None     - 程序名

         description=None,    - help时显示的开始文字

         epilog=None,     - help时显示的结尾文字

         parents=[],        -若与其他参数的一些内容一样,可以继承

         formatter_class=argparse.HelpFormatter,     - 自定义帮助信息的格式

         prefix_chars='-',    - 命令的前缀,默认是‘-’ 

         fromfile_prefix_chars=None,     - 命令行参数从文件中读取

         argument_default=None,    - 设置一个全局的选项缺省值,一般每个选项单独设置

         conflict_handler='error',     - 定义两个add_argument中添加的选项名字发生冲突时怎么处理,默认处理是抛出异常

         add_help=True    - 是否增加-h/--help选项,默认是True)

 

prefix_chars 参数设置为一个字符串,该字符串包含所有允许用来表示选项的字符。需要理解的是虽然prefix_chars包含允许用于开关的字符,但单个参数定义只能使用一种给定的开关语法。这让你可以对使用不同前缀的选项是否是别名(比如独立于平台的命令行语法的情况)或替代选择(例如,使用“+”表明打开一个开发,“-”则为关闭一个开关)进行显式地控制。

这些参数都有默认值,当调用parser.print_help()或者运行程序时由于参数不正确(此时python解释器其实也是调用了pring_help()方法)时,会打印这些描述信息,一般只需要传递description参数,如上。

 

四、方法add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

参数是从sys.argv[1:]开始取的。

1)传递值方法

import argparse

parser = argparse.ArgumentParser(description='Short sample app')

parser.add_argument('-a', action="store_true", default=False)
parser.add_argument('-b', action="store", dest="b")
parser.add_argument('-c', action="store", dest="c", type=int)

print parser.parse_args(['-a', '-bval', '-c', '3'])

有几种方式传递值给单字符选项。以上例子使用了两种不同的形式,-bval-c val

$ python argparse_short.py
Namespace(a=True, b='val', c=3)

“长”选项名字,即选项的名字多于一个字符,以相同的方式进行处理。

import argparse

parser = argparse.ArgumentParser(description='Example with long option names')

parser.add_argument('--noarg', action="store_true", default=False)
parser.add_argument('--witharg', action="store", dest="witharg")
parser.add_argument('--witharg2', action="store", dest="witharg2", type=int)

print parser.parse_args(['--noarg', '--witharg', 'val', '--witharg2=3'])

name or flags...    - 必选,指定参数的形式,一般写两个,一个短参数,一个长参数

2)参数动作

action 表示值赋予键的方式,这里用到的是bool类型,action意思是当读取的参数中出现指定参数的时候的行为

store 保存参数值,可能会先将参数值转换成另一个数据类型。若没有显式指定动作,则默认为该动作。

store_const 保存一个被定义为参数规格一部分的值,而不是一个来自参数解析而来的值。这通常用于实现非布尔值的命令行标记。

store_ture/store_false 保存相应的布尔值。这两个动作被用于实现布尔开关。

append 将值保存到一个列表中。若参数重复出现,则保存多个值。

append_const 将一个定义在参数规格中的值保存到一个列表中。

version 打印关于程序的版本信息,然后退出

parser.add_argument('--ver', '-v', action = 'store_true', help = 'hahaha') # 将变量以标签-值的字典形式存入args字典 # 添加--verbose标签,标签别名可以为-v,这里action的意思是当读取的参数中出现--verbose/-v的时候

help 可以写帮助信息 

 required    - 必需参数,通常-f这样的参数选项是可选的,但是如果required=True那么就是必须的了

 type   - 指定参数类型,就是一个函数,把从命令行输入的结果转成设置的类型

# required标签就是说--ver参数是必需的,并且类型为int,输入其它类型会报错
parser.add_argument('--ver', '-v', required = True, type = int)

而这个type类型还可以表示文件操作的类型从而直接进行文件的读写操作。

parser.add_argument('file', type=argparser.FileType('r'))
# 读取文件
args = parser.parse_args()
for line in args.file:
     print line.strip()

 

choices    - 设置参数的范围,如果choice中的类型不是字符串,要指定type。

表示该参数能接受的值只能来自某几个值候选值中,除此之外会报错,用choice参数即可

nargs    - 指定这个参数后面的value有多少个,默认为1

若nargs=2,则此时的值为2个整数的数组。

分析:nargs还可以'*'用来表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值;‘+’表示读取至少1个该位置参数。'?'表示该位置参数要么没有,要么就只要一个。(PS:跟正则表达式的符号用途一致。)

3)位置参数(positional arguments)
位置参数与sys.argv调用比较像,参数没有显式的--xxx或者-xxx标签,因此调用属性也与sys.argv相同。

parser.add_argument('filename') # 输入的第一个参数赋予名为filename的键
args = parser.parse_args() print "Read in %s" %(args.filename)
parser.add_argument('filename')
parser.add_argument('num', nargs='*)

就可以运行python test.py text.txt 1 2 由于没有标签,所以用位置参数的时候需要比较小心。

 

dest   - 设置这个选项的value解析出来后放到哪个属性中

parser.add_argument('-file', choices = ['test1', 'test2'], dest = 'world')
args = parser.parse_args()
print('read in %s'%(args.world))
结果:
G:\flower\python\arg_parse>python demo1.py -file test1
read in test1

 

5)参数默认值
一般情况下会设置一些默认参数从而不需要每次输入某些不需要变动的参数,利用default参数即可实现。

parser.add_argument('filename', default='text.txt')

这个时候至直接运行python text.py就能得到Read in text.txt而不需要输入文件名了。