Python之argparse库使用
文章目录
引入
argparse库用于编写用户命令行接口:用户需要定义程序所需的参数,而argparse会自动解析;生成帮助和使用说明,并在输入错误时进行提示。
1 从一个示例开始
以下示例为数的累加,介绍argparse的基本操作:
import argparse
def test():
# 初始化
parser = argparse.ArgumentParser()
# 添加参数,这里先不解释可选参数、必需参数和位置参数
# 添加类型为int的integer变量
parser.add_argument("integer", type=int)
# 同理
parser.add_argument("float", type=float)
# 通过列表的形式传递参数。这里无需传递指定类型的参数,因为argparse会自动识别
args = parser.parse_args(["1", "2.2"])
print(args)
if __name__ == '__main__':
test()
输出如下:
Namespace(integer=1, float=2.2)
通过这个示例,需要知道的是如何初始化和参数的传递。
当然,以下操作也可以在命令行进行 (假设文件名为test.py):
python test.py 1 2.2
此时将
args = parser.parse_args([“1”, “2.2”])
写作
args = parser.parse_args()
也是不会报错的。
2 ArgumentParser对象
在初始化ArgumentParser对象时,可以传递以下参数:
变量 | 用途或说明 | 默认值 |
---|---|---|
prog | 程序名称 | sys.argv[0] |
usage | 描述程序的字符串 | 自动生成 |
description | 使用帮助时,于help之前输出的文本 | None |
epilog | 使用帮助时,于help之后输出的文本 | None |
parents | 包含ArgumentParser对象的列表 | [] |
formatter_class | 一个自定义帮助输出的类 | None |
prefix_chars | 可选参数前缀的字符结合 | ‘-’ |
fromfile_prefix_chars | 应从中读取附加参数的文件的前缀字符集 | None |
argument_default | 参数的全局默认值 | None |
conflict_handler | 解决冲突选项的策略,通常不必要 | “error” |
add_help | 添加 -h/-help选项 | True |
allow_abbrev | 如果长选项的缩写不模糊,则允许其缩写 | True |
exit_on_error | 确定当程序发生错误时,是否带信息输出 | True |
当然很多参数我们平时是用不上的,不过后面依然会介绍到。
说明:
1)allow_abbrev:python>=3.5;
2)exit_on_error:python>=3.9。
以下着重介绍每一个变量。
2.1 prog
1)使用默认参数:
import argparse
def test():
# prog测试
parser = argparse.ArgumentParser()
parser.print_help()
if __name__ == '__main__':
test()
输出如****意usage后面的文字):
usage: test.py [-h]
optional arguments:
-h, --help show this help message and exit
2)使用自定义参数:
import argparse
def test():
# prog测试
parser = argparse.ArgumentParser(prog="Prog测试")
parser.print_help()
if __name__ == '__main__':
test()
输出如下:
usage: Prog测试 [-h]
optional arguments:
-h, --help show this help message and exit
2.2 usage
默认情况下将自动生成,个人感觉这个很方面;自定义则如下:
import argparse
def test():
# usage测试
# %(prog)s用于包含prog的内容
parser = argparse.ArgumentParser(usage="%(prog)s [options]")
parser.print_help()
if __name__ == '__main__':
test()
输出如下:
usage: test.py [options]
optional arguments:
-h, --help show this help message and exit
2.3 description和epilog
添加描述:
import argparse
def test():
# description测试
parser = argparse.ArgumentParser(description="这个是description的测试", epilog="俺也一样")
parser.print_help()
if __name__ == '__main__':
test()
输出如下:
usage: test.py [-h]
这个是description的测试
optional arguments:
-h, --help show this help message and exit
俺也一样
2.4 parents
有点像继承的感觉:当两个parser共用一组参数时,可以无需重复定义:
import argparse
def test():
# parents测试
# 需要设置add_help为False,否则会出现冲突
parser_parents = argparse.ArgumentParser(add_help=False)
parser_parents.add_argument("parents")
parser_son = argparse.ArgumentParser(parents=[parser_parents])
parser_son.add_argument("son")
parser_son.print_help()
parser_daughter = argparse.ArgumentParser(parents=[parser_parents])
parser_daughter.add_argument("daughter")
parser_daughter.print_help()
if __name__ == '__main__':
test()
输出如下:
usage: test.py [-h] parents son
positional arguments:
parents
son
optional arguments:
-h, --help show this help message and exit
usage: test.py [-h] parents daughter
positional arguments:
parents
daughter
optional arguments:
-h, --help show this help message and exit
需要注意的是,如传递了之后,如果父母改变,儿女这边是不受影响的。
2.5 formatter_class
用于改变输出格式的类,有以下四个:
1)RawDescriptionHelpFormatter;
2)RawTextHelpFormatter;
3)ArgumentDefaultsHelpFormatter;
4)MetavarTypeHelpFormatter。
其中前两种的控制选项更多。
2.5.1 RawDescriptionHelpFormatter
首先看看原版的:
import argparse
def test():
# formatter_class测试
parser = argparse.ArgumentParser(
description="""
今天天气好鸭
我要吃个饱啊
""",
add_help=False
)
parser.print_help()
if __name__ == '__main__':
test()
可以发现换行是莫得用的:
usage: test.py
今天天气好鸭 我要吃个饱啊
再来看看我们的主角:
import argparse
def test():
# formatter_class测试
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description="""
今天天气好鸭
我要吃个饱啊
我怎么顶格了?
""",
add_help=False
)
parser.print_help()
if __name__ == '__main__':
test()
和你的输入高度一致:
usage: test.py
今天天气好鸭
我要吃个饱啊
我怎么顶格了?
2.5.2 RawTextHelpFormatter
感觉和RawDescriptionHelpFormatter差不多:
import argparse
def test():
# formatter_class测试
parser = argparse.ArgumentParser(
formatter_class=argparse.RawTextHelpFormatter,
description="""
今天天气好啊
我要吃个饱啊
我怎么顶格了?
""",
add_help=False
)
parser.print_help()
if __name__ == '__main__':
test()
输出如下:
usage: test.py
今天天气好啊
我要吃个饱啊
我怎么顶格了?
2.5.3 ArgumentDefaultsHelpFormatter
当可选参数的传入有help选项时,可以输出默认值:
import argparse
def test():
# formatter_class测试
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument("--int", type=int, default=1, help="整数")
parser.print_help()
if __name__ == '__main__':
test()
输出如下:
usage: test.py [-h] [-int INT]
optional arguments:
-h, --help show this help message and exit
-int INT 整数 (default: 1)
2.5.4 MetavarTypeHelpFormatter
使用类型名来表示当前参数:
import argparse
def test():
# formatter_class测试
parser = argparse.ArgumentParser(
formatter_class=argparse.MetavarTypeHelpFormatter,
)
parser.add_argument("--int", type=int)
parser.add_argument("float", type=float)
parser.print_help()
if __name__ == '__main__':
test()
输出如下:
usage: test.py [-h] [--int int] float
positional arguments:
float
optional arguments:
-h, --help show this help message and exit
--int int
2.6 prefix_chars
默认前缀是’-’,parser也支持自定义前缀:
import argparse
def test():
# prefix_chars测试
parser = argparse.ArgumentParser(
prefix_chars="-+"
)
parser.add_argument("--a")
parser.add_argument("++b")
# 同时完成赋值操作
print(parser.parse_args("--a X ++b Y".split()))
if __name__ == '__main__':
test()
输出如下:
Namespace(a='X', b='Y')
2.7 fromfile_prefix_chars
把参数存入文件,并将指定前缀,即遇到指定前缀的参数认为是文件中的:
import argparse
def test():
# fromfile_prefix_chars测试
parser = argparse.ArgumentParser(
fromfile_prefix_chars='@'
)
# 先造一个文件
with open("args.ini", "w") as fp:
fp.write("c\nd")
parser.add_argument("a")
parser.add_argument("b")
args = parser.parse_args(["@args.ini"])
print(args)
if __name__ == '__main__':
test()
输出如下:
Namespace(a='c', b='d')
2.8 argument_default
用于为参数指定一个解析器容忍范围内的初始值:
import argparse
def test():
# argument_default测试
parser = argparse.ArgumentParser(
argument_default=argparse.SUPPRESS
)
parser.add_argument("--a")
# nargs='?'表示赋默认值
parser.add_argument("b", nargs="?")
args = parser.parse_args()
print(args)
if __name__ == '__main__':
test()
输出如下:
Namespace()
而如果没有argument_default=argparse.SUPPRESS,则会输出:
Namespace(a=None, b=None)
2.9 allow_abbrev
参考
上一篇: dubbo配置入门
下一篇: Java学习笔记(四)——反射与泛型