argparse 模块主要用于处理 Python 命令行参数和选项,程序定义好所需参数后,该模块会通过 sys.argv 解析出那些参数;除此之外,argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。使用 argparse 模块,我们可以轻松的编写出用户友好的命令行接口。
我们先来看一个简单示例:
文件名为 test.py,在控制输入命令:python test.py --help,执行结果:
通过上面的执行结果,我们可以看出 Python 的可选参数包括:--help 和其简写 -h,Python 使用 - 来指定短参数,使用 -- 来指定长参数 ,我们执行一下 python test.py -h,执行结果:
如果使用未定义的参数会报错,如:执行命令 python test.py -a,执行结果:
接下来我们看一下如何自定义参数,因为上面示例中 ArgumentParser() 和 parse_args() 函数,我们还没有详细说,所以这里我们也具体看一下:
这个方法是用来创建解析器对象的,看一下方法中每一个参数的含义:
parse_args(args=None, namespace=None)
用来解析参数,看一下参数说明:
add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
定义单个的命令行参数应当如何解析,看一下参数说明:
下面我们通过具体示例看一下:
先在控制台执行命令 python test.py -h,执行结果:
我们可以看到参数已经添加进来了,接着执行命令 python test.py -n Jhon 或 python test.py --name Jhon,执行结果:
从结果可以看出我们已经获取了控制台中输入的参数值了。
参考:
https://docs.python.org/zh-cn/3/library/argparse.html
在一些测试平台对接时或者用例执行时,或多或少会用到Python脚本传参的问题。
test.py脚本
#!/usr/bin/python3
import sys
print ('参数个数为:', len(sys.argv), '个参数。')
print ('参数列表:', str(sys.argv))
print ('脚本名:', str(sys.argv[0]))
print ('第一个参数:', sys.argv[1])
执行python3 test.py arg1 arg2 arg3
参数个数为: 4 个参数。
参数列表: ['test.py', 'arg1', 'arg2', 'arg3']
脚本名: test.py
第一个参数: arg1
test.py脚本
#!/usr/bin/python3
import argparse
# 生成了一个命令行参数的对象
parser = argparse.ArgumentParser(description='Test for argparse')
parser.add_argument('--name', '-n', help='name属性,非必要参数')
parser.add_argument('--year', '-y', help='year 属性,非必要参数,但有默认值', default=2017)
parser.add_argument('--body', '-b', help='body属性,必要参数', required=True)
args = parser.parse_args()
print (args.year, args.name, args.body)
查看帮助python3 test.py --help
usage: test.py [-h] [--name NAME] [--year YEAR] --body BODY
Test for argparse
optional arguments:
-h, --help show this help message and exit
--name或-n NAME name属性,非必要参数
--year或-y YEAR year属性,非必要参数,但有默认值
--body或-b BODY body 属性,必要参数
执行python3 test.py --year 2021 -n robot --body "are you ok?"
2021 robot are you ok?
以方法2中的test.py脚本为例
python3 test.py --year 2021 --body [\"test\", \"robot\",\"boy\" ]
2021 ["test", "robot", "boy" ]
以方法1中的test.py脚本为例
python3 test.py [\"test\", \"robot\",\"boy\" ]
参数个数为: 2个参数。
参数列表: ['test.py', '[\"test\", \"robot\", \"boy\" ]']
脚本名: test.py
第一个参数: ["test", "robot", "boy" ]
其实此时传入的第一个参数是一个字符,需要转换为列表。
import json
json.loads(sys.argv[1])
test_arg.py脚本
#!/usr/bin/python3
import argparse
import os
# 生成了一个命令行参数的对象
parser = argparse.ArgumentParser(description='Test for argparse')
parser.add_argument('--body', '-b', help='body属性,必要参数', required=True)
args = parser.parse_args()
print (args.body)
command=python3 + ' ' + test_sys.py+ ' ' + args.body
print (command)
str=('command')
result=os.system(str)
test_sys.py脚本
#!/usr/bin/python3
import sys
import json
print ('第一个参数:', sys.argv[1])
print ('列表:', json.loads(sys.argv[1]))
执行python3 test_arg.py --body [\"test\", \"robot\",\"boy\" ]
python3 test_sys.py ["test", "robot", "boy" ]
test_sys.py执行报错,转json失败。
还记得我们案例2中,脚本的传入指定参数和实际传入参数嘛?
test_arg.py脚本我们稍微优化下,在传参前先字符替换下。
["test", "robot", "boy" ]转换为[\"test\", \"robot\",\"boy\" ]即可。
command.replace(' " ' , r ' \" ') 添加到command=之后,再次运行看看呢?
在多个文件或者不同语言协同的项目中,python 脚本经常需要从命令行直接读取参数。下面我们通过几个例子来学习 argparse 。
我们先创建一个脚本 prog.py ,然后输入如下内容:
下面我们在 shell 中进行测试:
我们可以看出: prog.py 仅仅只有可选参数 -help 与其短写 -h ,为了传入更加复杂的参数,下面我们需要借用 parser.add_argument() 。
positional arguments
用法是不用带 - ,改写 prog.py 为
测试结果:
定义了一个叫 e 的参数,默认必选,分析:
optional arguments,有两种方式:
这两种方式可以同存,也可以只存在一个,修改 prog.py 内容如下:
测试结果:
通过图 3 我们很容易便明白可选参数的用法,但是 -v 必须指定参数值,否则就会报错,有没有像 -h 那样,不需要指定参数值的呢,答案是有,通过定义参数时指定 action="store_true" 即可,用法如下:
测试结果:
-v 没有指定任何参数也可,其实存的是 True 和 False ,如果出现,则其值为 True ,否则为 False :
默认的参数类型为 str ,如果要进行数学计算,需要在参数进行解析后进行类型转换,如果不能转换则会报错:
测试与结果:
2 中的 action 的例子中定义了默认值为 True 和 False 的方式,如果要限定某个值的取值范围,比如 3 中的整型,限定其取值范围为 0, 1, 2:
测试结果:
argparse.ArgumentParser(description="calculate X to the power of Y")
打印帮助信息时即显示 calculate X to the power of Y :
上个例子中定义了互斥参数:
第 4 行定义了一个互斥组,第 5, 6 行在互斥组中添加了 -v 和 -q 两个参数,用上个例子中的程序进行如下测试:
可以看出, -q 和 -v 不出现,或仅出现一个都可以,同时出现就会报错。
测试结果如下:
更多详细内容见: argparse — d2py 0.1 文档 (xinetzone.github.io)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)