配色: 字号:
python Argparse 模块入门
2016-11-10 | 阅:  转:  |  分享 
  
argparse是python标准库里面的用来处理命令行参数的库位置参数和选项参数先了解位置参数和选项参数的概念,以linux中’ls’命令
为例[root@openstack_1/]#lsbinbootdevetchomeliblost+fo
undmediamntoptprocrootsbinselinuxsrvsystmpu
srvar[root@openstack_1/]#lsroot/anaconda-ks.cfgdevstacki
ndex.htmlinstall.loginstall.log.syslog[root@openstack_1/]#l
s-l总用量86dr-xr-xr-x.2rootroot40964月122:42bindr-xr-xr-
x.5rootroot10244月122:43bootdrwxr-xr-x.18rootroot
38804月615:24devdrwxr-xr-x.77rootroot40964月615:24etc
drwxr-xr-x.3rootroot40964月220:50homedr-xr-xr-x.15ro
otroot122884月122:42libdrwx------.2rootroot163843月26
20:59lost+founddrwxr-xr-x.2rootroot40969月232011media
drwxr-xr-x.2rootroot40969月232011mntdrwxr-xr-x.3roo
troot40964月221:03optdr-xr-xr-x.128rootroot04月62
015procdr-xr-x---.5rootroot40964月221:05rootdr-xr-xr-x
.2rootroot122884月122:42sbindrwxr-xr-x.7rootroot
04月62015selinuxdrwxr-xr-x.2rootroot40969月232011s
rvdrwxr-xr-x.13rootroot04月62015sysdrwxrwxrwt.3ro
otroot40964月615:24tmpdrwxr-xr-x.12rootroot40963月26
21:03usrdrwxr-xr-x.18rootroot40963月2621:04var12345678
910111213141516171819202122232425第一次调用ls没有使用参数第二次调用使用了’root/’作为参
数第三次调用使用了‘-l’选项其中‘root/’是代表的位置参数而’-l’是选项参数。所谓位置参数就是程序根据该参数出
现的位置来确定其意义,比如上上面的例子中可以是’root/’也可以是’bin/’等等二:选项参数是应用程序已经设提前定义好
的参数,比如’-l’就是ls命令的一个选项用户在使用选项参数是必须要使用命令定义好的选项参数,而不是自己随意指定。使用示例
importargparseparser=argparse.ArgumentParser()parser.parse_arg
s()123执行脚本$pythonmain.py$pythonmain.py-husage:main.py[-h]opt
ionalarguments:-h,--helpshowthishelpmessageandexit12345
67上面的代码中第一次执行没有加参数不输出任何内容?的二次执行加上-h参数则输出帮助信息?上面的例子中对程序的描述比
较简单,可以自己加上对程序的描述信息importargparseparser=argparse.ArgumentParser
(description="saysomethingaboutthisapplication!!")parser.par
se_args()123$pythonmain.py-husage:main.py[-h]saysomethinga
boutthisapplication!!optionalarguments:-h,--helpshowthis
helpmessageandexit1234567对比之前的输出可以看到多出了一句话,这一句话就是在argparse.
ArgumentParser()函数中新加的参数好了现在准备给应用程序增加参数了,先说位置参数importargparsepa
rser=argparse.ArgumentParser(description="saysomethingaboutt
hisapplication!!")parser.add_argument(''name'')parser.parse_args(
)1234$pythonmain.pyusage:main.py[-h]namemain.py:error:toof
ewarguments123我们在程序程序中设置了一个位置参数’name’这样的话在运行程序时就需要指定一个位置参数否则就
会像上面那样报错$pythonmain.pytaylor12运行正确下面增加-h选项查看帮助文档$pythonmain
.pytaylor-husage:main.py[-h]namesaysomethingaboutthisapp
lication!!positionalarguments:nameoptionalarguments:-h,--he
lpshowthishelpmessageandexit1234567891011对比之前的输出发现多了一个po
sitionalarguments:帮助项并且有一个name字段表示这个程序需要指定一个name的位置参数。那么现在你可能
想要告诉程序的使用者这个name参数怎么用。想要实现这个功能只需要按照下面的方式来修改importargparseparser
=argparse.ArgumentParser(description="saysomethingaboutthis
application!!")parser.add_argument(''name'',help="icantellyou
howtosetanameargument")parser.parse_args()1234$pythonmain.
pytaylor-husage:main.py[-h]namesaysomethingaboutthisappl
ication!!positionalarguments:nameicantellyouhowto
setanameargumentoptionalarguments:-h,--helpshowthishel
pmessageandexit1234567891011可以看到name字段已经多了一个关于该字段的描述好了现在可以考虑获取
用户传入的值了importargparseparser=argparse.ArgumentParser(descriptio
n="saysomethingaboutthisapplication!!")parser.add_argument(''
name'',help="icantellyouhowtosetanameargument")result=
parser.parse_args()print(result.name)123456$pythonmain.pytaylo
rtaylor12对比程序和输出结果发现我们已经得到了用户输入的值。注意,python获取的值默认都是字符串类型的,无论用户输入
的是数字还是字符串。考虑下面的程序importargparseparser=argparse.ArgumentParser(
description="saysomethingaboutthisapplication!!")parser.add_
argument(''name'',help="icantellyouhowtosetanameargument
")result=parser.parse_args()print(type(result.name))123456$pyth
onmain.pytaylor$pythonmain.py12345612
34由上面比较可知,无论用户输入数字还是字符串在python的返回中都是字符串类型的,如果需要作为其他类型变量来使用,那么需要
先转换成相应的类型,比如用int(xx)转换成整数。如果需要指定用户类必须输入某种类型,那么可以这样做:importargp
arseparser=argparse.ArgumentParser(description="saysomethinga
boutthisapplication!!")parser.add_argument(''name'',type=int,
help="icantellyouhowtosetanameargument")result=parser.
parse_args()print(result.name)print(type(result.name))123456$pyth
onmain.pytaylorusage:main.py[-h]namemain.py:error:argument
name:invalidintvalue:''taylor''$pythonmain.py123456123456pe''int''>123456对比上面的程序和运行结果可知当指定了参数类型,当用户传入了一个错误类型的参数程序会报错退出
否则程序正常执行并且将结果转换成相应的数据类型使用选项参数importargparseparser=argparse.Ar
gumentParser(description="saysomethingaboutthisapplication!!
")parser.add_argument("--age",help="thisisanoptionalargument
")result=parser.parse_args()print(result.age)12345$pythonmain.
py-husage:main.py[-h][--optionalOPTIONAL]saysomethingabout
thisapplication!!optionalarguments:-h,--helpshow
thishelpmessageandexit--ageOPTIONALthisisanoptionala
rgument12345678帮助输出包含了对age选项的说明$pythonmain.py--ageusage:main.
py[-h][--optionalOPTIONAL]main.py:error:argument--age:expe
ctedoneargument123只指定了age选项但是没有制定该选项的值则会报错$pythonmain.py--
age888888$pythonmain.py--age=8888881234指定age的值为888在程序中可以获取到输
入值$pythonmain.pyNone12如果选项参数不指定值那么默认获取到的值是None可以给选项参数设置简称比如i
mportargparseparser=argparse.ArgumentParser(description="says
omethingaboutthisapplication!!")parser.add_argument("-a","--a
ge",help="thisisanoptionalargument")result=parser.parse_ar
gs()print(result.age)12345$pythonmain.py-a88888812可以向上面那样使用短标
签?当然有时候一个选项参数只是作为一个开关的作用,而不需要指定具体的值,如果使用了该选项则表示打开某个功能,否则表示关闭。imp
ortargparseparser=argparse.ArgumentParser(description="saysom
ethingaboutthisapplication!!")//thisexampleisfromwww.mntu
ku.cnparser.add_argument("-a","--age",help="thisisanoptional
argument",action="store_true")result=parser.parse_args()print
(result.age)12345$pythonmain.py-a888usage:main.py[-h][-a]m
ain.py:error:argument-a/--age:ignoredexplicitargument''888''
123如果此时给-a选项指定参数值,则会导致程序报错$pythonmain.py-aTrue12指定了选项则为true$p
ythonmain.pyFalse12没使用选项则为False也可以指定选项值为指定列表中的值importargparsep
arser=argparse.ArgumentParser(description="saysomethingabout
thisapplication!!")parser.add_argument("-a","--age",help="thisisanoptionalargument",type=int,choices=[0,1,2])result=parser.parse_args()print(result.age)12345在程序中指定了age参数类型为int并且只能是0,1,2三个数中的其中一个$pythonmain.py-a2212使用2作为参数值则正确输出$pythonmain.py-a5usage:main.py[-h][-a{0,1,2}]main.py:error:argument-a/--age:invalidchoice:5(choosefrom0,1,2)123使用5作为参数值因为5不在指定的列表当中所以会导致报错
献花(0)
+1
(本文系雨亭之东首藏)