原文链接:http://www.juzicode.com/python-module-argparse
我们先看一个ping命令的例子,可以用它来查看到某一台设备是否可以ping通,用’ping ip地址”就可以完成了:
从上面的输出可以看到ping命令发出后只会发出4次ping包,但是有些时候在调试网络通断时,可能需要让它一直发出ping包,直到观察到可以ping通了我们再手动结束,这时候就要在命令行里增加更多的选项来实现:
我们在执行py文件的时候也会遇到同样的需求,把py文件写的更具有兼容性,文件内部根据入参来决定执行哪一部分功能的代码。今天介绍的argparse就可以实现对命令入参的解析。
导入
argparse是python的标准库,直接import导入即可:
import argparse
最简单例子
我们先用ArgumentParser()创建一个实例ap,然后调用它的parse_args()方法,将这段代码保存在文件中。
#juzicode.com/VX公众号:juzicode
import argparse
ap = argparse.ArgumentParser()
ap.parse_args()
然后运行这个文件,下面尝试了3种执行方式,不带参数、带-h参数,带-x参数:
E:\juzicode\py\命令解析器>python argparse-基本用法.py
E:\juzicode\py\命令解析器>python argparse-基本用法.py -h
usage: argparse-基本用法.py [-h]
options:
-h, --help show this help message and exit
E:\juzicode\py\命令解析器>
E:\juzicode\py\命令解析器>python argparse-基本用法.py -x
usage: argparse-基本用法.py [-h]
argparse-基本用法.py: error: unrecognized arguments: -x
E:\juzicode\py\命令解析器>
从运行结果可以看到:1)在没有任何选项的情况下运行脚本不会有任何打印。2)当使用-h参数时,打印出来了帮助信息,提示默认包含的参数选项有-h,–help,而且还解释了这条选项的用途,从打印的信息看这是一条默认的帮助信息。3)当使用-x参数时,提示并不支持-x参数。
添加位置参数
从前面的ping命令我们可以看到,紧跟ping之后的第1个参数是一个ip地址表示的目标主机名称,这其实是一个位置参数,位置参数顾名思义就是它所在的位置是确定的,在这个位置就表示这应该是一个主机名称,可以是ip地址或者一个字符表示的主机名称。
argparse模块使用ArgumentParser.add_argument()方法添加位置参数:
#juzicode.com/VX公众号:juzicode
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("ip")
ap.add_argument("port")
args = ap.parse_args()
print('args:',args)
print('ip:',args.ip)
print('port:',args.port)
运行结果:
E:\juzicode\py\命令解析器>python argparse-位置参数.py -h
usage: argparse-位置参数.py [-h] ip port
positional arguments:
ip
port
options:
-h, --help show this help message and exit
E:\juzicode\py\命令解析器>
E:\juzicode\py\命令解析器>python argparse-位置参数.py 192.168.1.1 600
args: Namespace(ip='192.168.1.1', port='600')
ip: 192.168.1.1
port: 600
E:\juzicode\py\命令解析器>
从运行结果可以看到,使用-h参数可以打印出来帮助信息,显示有2个位置参数,还有一个选项参数-h。从第2次执行的结果可以看到,使用ArgumentParser.parse_args()解析出来的参数对应了输入命令行的第1和第2个位置参数。
当然在这个简单例子如果你故意把ip和port的实际位置写反它也会将错就错的:
E:\juzicode\py\命令解析器>python argparse-位置参数.py 600 192.168.1.1
args: Namespace(ip='600', port='192.168.1.1')
ip: 600
port: 192.168.1.1
E:\juzicode\py\命令解析器>
为了提供更多的帮助信息,我们还可以在添加参数时传入help参数给出更多的帮助信息:
#juzicode.com/VX公众号:juzicode
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("ip",
help="IP地址",
type=str)
ap.add_argument("port",
help="端口号",
type=int)
args = ap.parse_args()
print('args:',args)
print('ip:',args.ip)
print('port:',args.port)
输入-h的运行结果:
E:\juzicode\py\命令解析器>python argparse-位置参数2.py -h
usage: argparse-位置参数2.py [-h] ip port
positional arguments:
ip IP地址
port 端口号
options:
-h, --help show this help message and exit
E:\juzicode\py\命令解析器>
可以看到当使用-h参数打印帮助信息时,可以得到更多的提示信息。
另外这个例子中也指定了传入参数的类型,如果使用错误的参数类型,也会给出提示,比如下面这个例子中port位置参数不能转换为整数型:
E:\juzicode\py\命令解析器>python argparse-位置参数2.py 192.168.1.1 abc
usage: argparse-位置参数2.py [-h] ip port
argparse-位置参数2.py: error: argument port: invalid int value: 'abc'
E:\juzicode\py\命令解析器>
添加选项参数
在使用add_argument()方法添加参数时,使用【-】或者【–】带字符串表示可选参数,可以选其中一种或者两种形式:
#juzicode.com/VX公众号:juzicode
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("num1", help="第1个计算数", type=int)
ap.add_argument("num2", help="第2个计算数", type=int)
ap.add_argument("-r", "--rule", help="计算规则")
args = ap.parse_args()
print('args:', args)
print('num1:', args.num1)
print('num2:', args.num2)
print('rule:', args.rule)
if args.rule == '+':
print('结果=', args.num1 + args.num2)
elif args.rule == '-':
print('结果=', args.num1 - args.num2)
else:
print('未识别的计算')
运行结果:
E:\juzicode\py\命令解析器>python argparse-可选参数.py 2 3 -r -
args: Namespace(num1=2, num2=3, rule='-')
num1: 2
num2: 3
rule: -
结果= -1
E:\juzicode\py\命令解析器>python argparse-可选参数.py 2 3 --rule +
args: Namespace(num1=2, num2=3, rule='+')
num1: 2
num2: 3
rule: +
结果= 5
E:\juzicode\py\命令解析器>python argparse-可选参数.py 2 3
args: Namespace(num1=2, num2=3, rule=None)
num1: 2
num2: 3
rule: None
未识别的计算
当用add_argument()添加参数时,如果设置了入参action=”store_true”,该选项参数后面则不需要带任何内容,并且在命令行显式传入时则为True,否则则为False。反之,如果设置action=”store_false”则反过来理解。
下面这个例子设置了rule入参action=”store_true”,当带有–rule选项时则执行加法操作,没有时执行减法操作:
#juzicode.com/VX公众号:juzicode
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("num1", help="第1个计算数", type=int)
ap.add_argument("num2", help="第2个计算数", type=int)
ap.add_argument("-r", "--rule", help="计算规则", action="store_true")
args = ap.parse_args()
print('args:', args)
print('num1:', args.num1)
print('num2:', args.num2)
print('rule:', args.rule)
if args.rule == True:
print('结果=', args.num1 + args.num2)
else:
print('结果=', args.num1 - args.num2)
运行结果:
E:\juzicode\py\命令解析器>python argparse-可选参数2.py 2 3 --rule
args: Namespace(num1=2, num2=3, rule=True)
num1: 2
num2: 3
rule: True
结果= 5
E:\juzicode\py\命令解析器>python argparse-可选参数2.py 2 3
args: Namespace(num1=2, num2=3, rule=False)
num1: 2
num2: 3
rule: False
结果= -1
今天的文章介绍了argparse的常用用法,包括如何添加位置参数,添加带传入值的选项参数、不带传入值解析为真假的选项参数等等。更多关于argparse的高阶用法可以参考Python标准库文档。