python之argparse 模块

python之argparse 模块,第1张

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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11793772.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存