python3中argparse 模块详解
python 标准库sys 模块
sys 模块
⽤于提供对Python解释器相关的操作:
python 命令⾏参数(sys.argv )
有时候我们需要写⼀些脚本处理⼀些任务,这时候往往需要提供⼀些命令⾏参数,根据不同参数进⾏不同的处理,在Python⾥,命令⾏的参数和C语⾔很类似(因为标准Python是⽤C语⾔实现的)。在C语⾔⾥,main函数的原型为int main(int argc, char ** argv),这⾥主要指linux平台, argc指的是命令⾏传⼊的参数个数(程序的name为第⼀个参数),⽽argv则是⼀个指针数组,每⼀个元素为指向⼀个命令⾏参数的指针。在Python⾥的命令⾏参数是存储在sys.argv⾥,argv是⼀个列表,第⼀个元素也为程序名称。argparse 模块
作⽤: argparse 是 Python 内置的⼀个⽤于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从sys.argv 中解析出这些参数,并⾃动⽣成帮助和使⽤信息。当然,Python 也有第三⽅的库可⽤于命令⾏解析,⽽且功能也更加强⼤,⽐如docopt,Click。
1. 命令⾏参数分为位置参数和选项参数:位置参数就是程序根据该参数出现的位置来确定的如:[root@openstack_1 /]# ls root/ #其中root/是位置参数选项参数是应⽤程序已经提前定义好的参数,不是随意指定的
如:[root@openstack_1 /]# ls -l # -l 就是ls命令⾥的⼀个选项参数
2. 使⽤步骤:
(1)import argparse ⾸先导⼊模块
(2)parser = argparse.ArgumentParser() 创建⼀个解析对象
(3)parser.add_argument() 向该对象中添加你要关注的命令⾏参数和选项
(4)parser.parse_args() 进⾏解析
3. argparse.ArgumentParser ()⽅法参数须知:⼀般我们只选择⽤description sys .argv          #命令⾏参数List ,第⼀个元素是程序本⾝路径sys .exit (n )        #退出程序,正常退出时exit(0)sys .version        #获取Python 解释程序的版本信息sys .maxint      #  最⼤的Int 值sys .path          #返回模块的搜索路径,初始化时使⽤PYTHONPATH 环境变量的值sys .platform      #返回操作系统平台名称sys .stdin          #输⼊相关sys .stdout        #输出相关sys .stderror      #错误相关
1
2
3
4
5
6
7
8
9  #### sys.argv 练习  import  sys  for  i in  sys .argv :      print (i )  #if __name__ == '__main__':  #    for item in sys.argv:  #        print item
1
2
3
4
5
6
7
8
1. description - 命令⾏帮助的开始⽂字,⼤部分情况下,我们只会⽤到这个参数
2. epilog - 命令⾏帮助的结尾⽂字
3. prog - (default: sys.argv[0])程序的名字,⼀般不需要修改,另外,如果你需要在help中使⽤到程序的名字,可以使⽤%(prog)s
4. prefix_chars - 命令的前缀,默认是-,例如-f/–file。有些程序可能希望⽀持/f这样的选项,可以使⽤prefix_chars=”/”
5. fromfile_prefix_chars - (default: None)如果你希望命令⾏参数可以从⽂件中读取,就可能⽤到。例如,如果
fromfile_prefix_chars=’@’,命令⾏参数中有⼀个为”@”,的内容会作为命令⾏参数
6. add_help - 是否增加-h/-help选项 (default: True),⼀般help信息都是必须的,所以不⽤设置啦。
7. parents - 类型是list,如果这个parser的⼀些选项跟其他某些parser的选项⼀样,可以⽤parents来实现继承,例如parents=
[parent_parser]
8. 三个允许的值: # class argparse.RawDescriptionHelpFormatter 直接输出description和epilog的原始形式(不进⾏⾃动换⾏和
消除空⽩的操作) # class argparse.RawTextHelpFormatter 直接输出description和epilog以及add_argument中的help字符串的原始形式(不进⾏⾃动换⾏和消除空⽩的操作) # class argparse.ArgumentDefaultsHelpFormatter 在每个选项的帮助信息后⾯输出他们对应的缺省值,如果有设置的话。这个最常⽤吧!
9. argument_default - (default: None)设置⼀个全局的选项的缺省值,⼀般每个选项单独设置,所以这个参数⽤得少,不细说
10. usage - (default: generated)如果你需要修改usage的信息(usage: PROG [-h] [–foo [FOO]] bar [bar …]),那么可以修改这
个,⼀般不要修改。
11. conflict_handler - 不建议使⽤。这个在极端情况下才会⽤到,主要是定义两个add_argument中添加的选项的名字发⽣冲突时怎么
处理,默认处理是抛出异常。
4. add_argument()⽅法参数须知:
1. name or flags - 指定参数的形式,想写⼏个写⼏个,不过我们⼀般就写两个,⼀个短参数,⼀个长参数,看下⾯的例⼦”-f”, “–
file”
2. 可选的选项,位置不固定,想怎么写就怎么写,默认是可选的 # parser.add_argument(“-f”, “–file”, help=”test test
test”)
3. 位置固定的选项,例如”prog i_am_bar”,这样⼦的话,i_am_bar就是bar选项的值啦,默认是必须有的 #
parser.add_argument(“bar”, help=”test test test”)
4. nargs - 指定这个参数后⾯的value有多少个,例如,我们希望使⽤-n 1 2 3 4,来设置n的值为[1, 2, 3, 4]
#parser.add_argument(“-n”, “–num”, nargs=”+”, type=int) # 这⾥nargs=”+”表⽰,如果你指定了-n选项,那么-n后⾯⾄少要跟⼀个参数,+表⽰⾄少⼀个,?表⽰⼀个或0个,0个或多个 。
5. default - 如果命令⾏没有出现这个选项,那么使⽤default指定的默认值 #parser.add_argument(“+g”, “++gold”,
help=”test test test”,default=”test_gold”)#需要prefix_chars包含”+” 。
6. type - 如果希望传进来的参数是指定的类型(例如 float, int or file等可以从字符串转化过来的类型),可以使⽤
#parser.add_argument(“-x”, type=int) 。
7. choices - 设置参数值的范围,如果choices中的类型不是字符串,记得指定type哦 #parser.add_argument(“-y”, choices=
[‘a’, ‘b’, ‘d’])
8. required - 通常-f这样的选项是可选的,但是如果required=True那么就是必须的了 #parser.add_argument(“-z”, choices=
[‘a’, ‘b’, ‘d’], required=True)
9. metavar - 参数的名字,在显⽰ 帮助信息时才⽤到. # parser.add_argument(“-o”, metavar=”OOOOOO”)
10. help - 设置这个选项的帮助信息
11. dest - 设置这个选项的值就是解析出来后放到哪个属性中 #parser.add_argument(“-q”, dest=”world”)
python怎么读取py文件12. args = parser.parse_args(args) # 如果你没有args参数,那么就使⽤sys.argv,也就是命令⾏参数啦。有这个参数,就⽅便我们
调试啊 。# args.world就是-q的值啦
13. action - The basic type of action to be taken when this argument is encountered at the command line.
14. const - A constant value required by some action and nargs selections.
分析:nargs还可以’*‘⽤来表⽰如果有该位置参数输⼊的话,之后所有的输⼊都将作为该位置参数的值;‘+’表⽰读取⾄少1个该位置参数。’?'表⽰该位置参数要么没有,要么就只要⼀个。(PS:跟正则表达式的符号⽤途⼀致。)
如:
dest - 设置这个选项的value解析出来后放到哪个属性中
add
如果脚本很简单或临时使⽤,没有多个复杂的参数选项,可以直接利⽤sys.argv将脚本后的参数依次读取(读进来的默认是字符串格式)。⽐如如下名为test.py的脚本:
在shell脚本中运⾏python help可以得到Input argument is help的结果。
1. ⼀般形式
但是⼤多数情况下,脚本很可能需要多个参数,⽽且每次参数的类型⽤处各不相同,那么这个时候在参数前添加标签表明参数的类型和⽤途便⼗分有⽤,⽽利⽤argparse模块可以很⽅便得实现这⼀⽬的。
同样⽤名为test.py的脚本举个栗⼦:parser = argparse .ArgumentParser ()parser .add_argument ('echo')    # add_argument()指定程序可以接受的命令⾏选项args = parser .parse_args ()      # parse_args()从指定的选项中返回⼀些数据print (args )print (args .echo )
2
3
4
5
6parser = argparse .ArgumentParser (description = 'this is a description')parser .add_argument ('--ver', '-v', action = 'store_true', help  = 'hahaha')# 将变量以标签-值的字典形式存⼊args 字典args = parser .parse_args ()if  args .ver :    print ("Ture")else :    print ("False")
1
2
3
4
5
6
78# required 标签就是说--ver 参数是必需的,并且类型为int ,输⼊其它类型会报错parser .add_argu
ment ('--ver', '-v', required = True , type  = int )
1
2parser .add_argument ('file', choices = ['test1', 'test2'])args = parser .parse_args ()print ('read in %s'%(args .file ))
1
2
3# 表⽰脚本可以读⼊两个整数赋予num 键(此时的值为2个整数的数组)parser .add_argument ('filename', nargs = 2, type  = int )args = parser .parse_args ()print ('read in %s'%(args .filename ))
1
2
3
4parser .add_argument ('filename', nargs = '+', type  = int )args = parser .parse_args ()print ('read in
%s'%(args .filename ))
1
2
3parser .add_argument ('-file', choices = ['test1', 'test2'], dest = 'world')args = parser .parse_args ()print ('read in %s'%(args .world ))
1
2
3import  sys print  "Input argument is %s" %(sys .argv )
1
2
运⾏python test.py后⾯跟了–verbose/-v的时候会输出前者,如果什么都没有会输出后者。如果输⼊了–verbose/-v以外的参数则会报错:unrecognized arguments
稍微提⼀下,action参数表⽰值赋予键的⽅式,这⾥⽤到的是bool类型;如果是’count’表⽰将–verbose标签出现的次数作为verbose 的值;'append’表⽰将每次出现的该便签后的值都存⼊同⼀个数组再赋值。(嘛,⼀般后⾯两种⽤的⽐较少就不多说了)
PS:–help标签在使⽤argparse模块时会⾃动创建,因此⼀般情况不需要我们主动定义帮助信息。
2. 必需参数
这种模式⽤于确保某些必需的参数有输⼊。
required标签就是说–verbose参数是必需的,并且类型为int,输⼊别的类型会报错。
3)位置参数(positional arguments)
位置参数与sys.argv调⽤⽐较像,参数没有显式的–xxx或者-xxx标签,因此调⽤属性也与sys.argv相同。
输⼊则会输出Read 此外,可以⽤nargs参数来限定输⼊的位置参数的个数,默认为1。当然nargs参数也可⽤于普通带标签的参数。
parser.add_argument('num', nargs=2, type=int)表⽰脚本可以读⼊两个整数赋予num键(此时的值为2个整数的数组)。nargs还可以’*‘⽤来表⽰如果有该位置参数输⼊的话,之后所有的输⼊都将作为该位置参数的值;‘+’表⽰读取⾄少1个该位置参数。’?'表⽰该位置参数要么没有,要么就只要⼀个。(PS:跟正则表达式的符号⽤途⼀致。)⽐如⽤:
就可以运⾏ 1 2
由于没有标签,所以⽤位置参数的时候需要⽐较⼩⼼。
4)输⼊类型
之前已经提到了⽤type参数就可以指定输⼊的参数类型。⽽这个type类型还可以表⽰⽂件操作的类型从⽽直接进⾏⽂件的读写操作。parser = argparse .ArgumentParser (description ="your script description")            # description 参数可以⽤于插⼊描述脚本⽤途的信息,可以为空parser .add_argument ('--verbose', '-v', action ='store_true', help='verbose mode')  # 添加--verbose 标签,标签别名可以为-v ,这⾥action 的意思是当读取的参
# 参数字典的verbose 建对应的值为True ,⽽help 参数⽤于描述--verbose 参数的⽤途或意义。args = parser .parse_args ()                                                        # 将变量以标签-值的字典形式存⼊args 字典if  args .verbose :    print  "Verbose mode on!"else :    print  "Verbose mode off!"2
3
4
5
6
7
8
9
10$ python test .py --help usage : test .py [-h ] [--verbose ]your script description optional arguments :    -h , --help        show this help  message and  exit    --verbose , -v    verbose mode
1
2
3
4
5
6
7
8parser .add_argument ('--verbose', required =True , type=int )
1parser .add_argument ('filename')    # 输⼊的第⼀个参数赋予名为filename 的键args = parser .parse_args ()print  "Read in %s" %(args .filename )
1
2
3parser .add_argument ('filename')parser .add_argument ('num', nargs ='*)
1
2
5)参数默认值
⼀般情况下会设置⼀些默认参数从⽽不需要每次输⼊某些不需要变动的参数,利⽤default参数即可实现。
这个时候⾄直接运⾏python text.py就能得到Read ⽽不需要输⼊⽂件名了。
6)候选参数选择
表⽰该参数能接受的值只能来⾃某⼏个值候选值中,除此以外会报错,⽤choices参数即可。⽐如:action参数 argparse内置6种动作可以在解析到⼀个参数时进⾏触发:
store  保存参数值,可能会先将参数值转换成另⼀个数据类型。若没有显式指定动作,则默认为该动作。store_const  保存⼀个被定义为参数规格⼀部分的值,⽽不是⼀个来⾃参数解析⽽来的值。这通常⽤于实现⾮布尔值的命令⾏标记。store_ture/store_false  保存相应的布尔值。这两个动作被⽤于实现布尔开关。
append  将值保存到⼀个列表中。若参数重复出现,则保存多个值。
append_const  将⼀个定义在参数规格中的值保存到⼀个列表中。
version  打印关于程序的版本信息,然后退出parser .add_argument ('file', type=argparser .FileType ('r'))    # 读取⽂件args = parser .parse_args ()for  line in  args .file :    print  line .strip ()
1
2
3
4parser .add_argument ('filename', default ='')
1parser .add_argument ('filename', choices =['', ''])
1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。