Python轮子:命令解析器~argparse

原文链接: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标准库文档。

 

 

扩展阅读:

  1.  argparse — 命令行选项、参数和子命令解析器 — Python 3.10.13 文档

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注