Argparse是python标准库中的命令行解析模块
还有其他 两个模块可以实现这一功能,getopt(等同于C语言中的getopt())和弃用的optparse。关于这两个模块我没有了解过,有兴趣的同学可以去看一下
https://docs.python.org/2/library/optparse.html#module-optparse
https://docs.python.org/2/library/getopt.html#module-getopt
1. 首先我们先写一个py文件。内容如下:
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
运行:
分析:
- 我们不加任何参数的时候,什么反应也没有
- 加上参数后我似乎得到了点什么内容,可以发现通过 -h或者–help 获得一些帮助内容。
- 有没有发现很像linux系统下的 ls命令 可以有参数也可已没有参数,当我们带参数时我们可以获得我们希望的结果
2. 好的我们继续探索
更改我们的py文件内容如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("helloworld")
args = parser.parse_args()
print (args.helloworld)
我们运行一下:
它似乎并不给我们面子,报错了,告诉我们这里需要一个参数,好吧那我们再来看看帮助信息。
帮助信息变了,出现了一个定位参数,并且这里告诉我们需要给helloworld一个参数,好吧看来的确是这样的,那我们就满足它的要求。
咦,出来了,你想要的结果,没错了是你代码里面的内容。
3. 到这里呢我么已经接触了三个方法
parser = argparse.ArgumentParser() #用来创建一个解析对象
parser.add_argument(“helloworld”) #给这个解析对象一个参数
args = parser.parse_args() #获取解析对象参数
第一个和第三个没什么讲的,我们接着来讲一讲第二个方法add_argument。
写入:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("wine", help = "小二,请给我一壶酒")
parser.add_argument("meat", help = "小二,请给我一碗肉")
args = parser.parse_args()
print ("小二结帐,给你",args.wine+args.meat,"块钱")
运行结果:
---->现在这里告诉我么需要两个参数,那么帮助文档呢?
---->帮助文档也变了,哈哈 这是不是在告诉你 我们可以自己给这些参数加一些解释文档呢?对的,只要你通过 help = " " 就可以轻松加一些更利于我们理解的内容了
别高兴太早,我们继续,我们来给他两个参数。
---->什么情况??出大问题,我代码里明明做的相加,怎么成了34块钱,真相只有一个!它们两个被当作字符串处理了。。。。。。也就是说如果不指定参数类型,argparse默认它是字符串。
结果分析:
- 我们可以通过 add_argument() 方法添加我们想要的参数
- 我们可以通过 help = " " 形式添加更容易理解的帮助信息
- 如果不指定参数类型,argparse默认它是字符串。
那么现在我们来告诉他我们想要的参数类型。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("wine", help = "小二,请给我一壶酒",type = int)
parser.add_argument("meat", help = "小二,请给我一碗肉",type = int)
args = parser.parse_args()
print ("小二结帐,给你",args.wine+args.meat,"块钱")
运行结果:
ok一切正常了。我们继续。
4. 说完 【定位参数】 我们再来说一说【可选参数】
可选参数只需在名字前加 - - 就好了
更改代码为:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--wine", help = "小二,有没有酒?有请给我一壶酒, type = int")
parser.add_argument("--meat", help = "小二,有没有肉?有请给我一碗肉, type = int")
args = parser.parse_args()
if args.wine and not args.meat:
print("只有酒!")
print ("小二结帐,给你",args.wine,"块钱")
if args.meat and not args.wine:
print("只有肉!")
print ("小二结帐,给你",args.meat,"块钱")
if args.wine and args.meat:
print("有酒有肉!")
print ("小二结帐,给你",args.wine+args.meat,"块钱")
if not args.wine and not args.meat:
print("不好意思客官,小店今天生意好,都卖完了!你改天再来!")
运行结果:
分析:
- 可以看到我们不给任何参数时依然是可以的。
- 一定要注意的是,如果不指定可选的参数,对应的变量就被设置为None,None是不能和整型比较的
- 再看帮助文档也变了,变为optional arguments。
我们给他其中一个参数,或者两个参数都给会怎么样呢?
分析:
- 我们在给可选参数传参时要指定可选参数的参数名。
- 可选参数在传参时不受先后顺序的影响。
- 如果我们没有指定参数类型,依然会被默认为字符串
有的人会说了,每次传参还要打–meat --wine 什么的好麻烦啊!别急,我们稍微改一下代码 你就不用那么麻烦了。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-w","--wine", help = "小二,有没有酒?有请给我一壶酒",type = int)
parser.add_argument("-m","--meat", help = "小二,有没有肉?有请给我一碗肉",type = int)
args = parser.parse_args()
if args.wine and not args.meat:
print("只有酒!")
print ("小二结帐,给你",args.wine,"块钱")
if args.meat and not args.wine:
print("只有肉!")
print ("小二结帐,给你",args.meat,"块钱")
if args.wine and args.meat:
print("有酒有肉!")
print ("小二结帐,给你",args.wine+args.meat,"块钱")
if not args.wine and not args.meat:
print("不好意思客官,小店今天生意好,都卖完了!你改天再来!")
运行结果:
这下是不是轻松多了呢?(自我安慰。。。)有没有注意到,我们在使用时既可以用-w/-m也可以用–wine/–meat ,我们还可一穿插着用!
ok先到这里吧,一下子写完未免太长了!估计会影响到一些人看这篇博客的欲望。哈哈,中场休息!