argparse入门--轻松解析命令行参数
argparse是Python标准库中的一个模块(意味着它不需要安装),用于从命令行中解析参数。
argparse模块可以处理命令行参数的解析,并提供了一种方便的方式来定义参数的名称、类型、默认值、帮助信息等。
使用argparse模块可以轻松地编写命令行工具,并且可以自动生成帮助信息和使用说明,使得用户可以方便地了解和使用命令行工具。
引入
from argparse import ArgumentParser
helloworld
以下是一个可以快速入门的小案例
from argparse import ArgumentParser
parser = ArgumentParser(description="这是一个argparse的示例")
parser.add_argument("-a", "--a", type=int, help="a的值, type为int")
parser.add_argument("-a", "--b", type=bool, help="b的值, bool, 它的值一定为True")
python_args = parser.parse_args()
print(python_args)
print(python_args.a)
print(python_args.b) # 如果不传入b,值为None
# print(python_args.c) # 如果不使用`add_argument`,则会报错'Namespace' object has no attribute 'c'
使用argparse,首先会经历三步:
导入
ArgumentParser
,并初始化它调用
add_argument
函数,添加想让用户输入的参数调用
parse_args
函数,解析用户输入的参数,并用这些参数达成我们想要的动作
创建解析器
我们可以使用ArgumentParser
来创建一个命令行解析器
from argparse import ArgumentParser
parser = ArgumentParser(description="这是一个argparse的示例")
在ArgumentParser
中,除了description
,还有其他一些常用的参数,下面是其中的一些重要选项:
prog
: (可选) 指定程序名。如果不指定,则会使用sys.argv[0]
(即脚本的名字)。usage
: (可选) 指定帮助信息中显示的用法字符串。如果不指定,则 argparse 会从添加的参数推断出用法。description
: (可选) 一段简短的描述性文本,将在帮助信息的顶部显示。epilog
: (可选) 一段描述性文本,将在帮助信息的底部显示。parents
: (可选) 一个包含其他ArgumentParser
对象的列表,这些对象定义了应该包含在当前解析器中的参数。这可以用来继承参数。formatter_class
: (可选) 一个用于格式化帮助信息的类。默认是argparse.HelpFormatter
,也可以选择其他格式器,例如argparse.RawDescriptionHelpFormatter
和argparse.ArgumentDefaultsHelpFormatter
。prefix_chars
: (可选) 字符串,指定可选参数的前缀字符。默认是-
。fromfile_prefix_chars
: (可选) 字符串,指定可选参数可以从文件读取的前缀字符。例如,如果设置为@
,则可以使用@filename
从文件读取参数。argument_default
: (可选) 默认应用于所有参数的默认值。如果未指定,则不设置默认值。conflict_handler
: (可选) 指定如何处理冲突的参数定义。可能的值有error
,resolve
,ignore
,always
。add_help
: (可选) 是否添加-h
/--help
选项。默认为 True。
一般description
用得比较多,可以这么调用
from argparse import ArgumentParser
# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(
prog='my_program',
usage='%(prog)s [options] arg1 arg2',
description='This is a sample program that processes some integers.',
epilog='This is where you can put additional information about the program.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
prefix_chars='-+',
fromfile_prefix_chars='@',
conflict_handler='resolve',
add_help=True
)
添加命令行参数
使用add_argument
为模块添加命令行参数
from argparse import ArgumentParser
parser = ArgumentParser(description="这是一个argparse的示例")
parser.add_argument("-a", "--a", type=int, help="a的值, type为int")
parser.add_argument("-a", "--b", type=bool, help="b的值, bool, 它的值一定为True")
以下是一些常用参数及其说明:
基本参数
name_or_flags
: 必需参数,可以是一个字符串或一个字符串列表。它指定了参数的名称和/或可选标志。位置参数:只提供名称,如
add_argument("x")
。可选参数:提供一个或多个标志,如
add_argument("-x", "--example")
。
其他常用参数
action
: (可选) 指定当参数在命令行中被找到时采取的动作。默认是store
,下面是该参数可以传入的值:store
: 将参数值存储到命名空间中。store_const
: 存储常量值,通常与 const 配合使用。store_true
/store_false
: 在命令行中出现时分别存储 True/False。append
: 将值附加到列表中。append_const
: 将常量值附加到列表中。count
: 计算命令行中该参数出现的次数。extend
: 将值扩展到列表中(适用于多个值)。help
: 显示帮助信息并退出。version
: 输出版本信息并退出。
nargs
: (可选) 指定应该从命令行读取多少个参数。默认是 None,意味着读取单个参数。N
: 读取 N 个参数并将它们作为列表返回。?
: 读取 0 或 1 个参数。*
: 读取 0 个或更多参数。+
: 读取 1 个或更多参数。
const
: (可选) 与某些 action 结合使用时指定的常量值。default
: (可选) 如果命令行中没有提供参数时的默认值。type
: (可选) 指定参数的类型转换函数,默认是 str。choices
: (可选) 参数的有效值列表。如果提供的值不在列表中,则抛出错误。required
: (可选) 指定参数是否是必需的。对于位置参数,默认为 True;对于可选参数,默认为 False。help
: (可选) 帮助字符串,用于生成帮助消息。metavar
: (可选) 在帮助字符串中使用的参数的元变量名称。dest
: (可选) 指定在命名空间中存储结果的属性名。
from argparse import ArgumentParser
# 创建 ArgumentParser 对象
parser = ArgumentParser(description="这是一个argparse的示例")
# 添加位置参数
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
# 添加可选参数
parser.add_argument('-s', '--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)')
# 添加带有默认值的可选参数
parser.add_argument('-v', '--verbosity', type=int, default=1, choices=[0, 1, 2], help='set the verbosity level')
# 添加 store_true 动作的可选参数
parser.add_argument('--debug', action='store_true', help='enable debug mode')
命令输入
在我们用命令行调用改参数时,如何输入参数呢?
以helloworld为例子,将改python代码命名为test.py,我们可以在命令行中输入以下命令:
python -u test.py -a 1
此时-a
参数会传到python模块中
注意当add_argument
的形参required
设置为True后,则必须输入该参数,否则会报错
解析参数
我们可以使用parse_args
解析命令行传递的参数
from argparse import ArgumentParser
parser = ArgumentParser(description="这是一个argparse的示例")
parser.add_argument("-a", "--a", type=int, help="a的值, type为int")
python_args = parser.parse_args()
print(python_args)
print(python_args.a)
parse_args
会传回一个Namespace
对象,如果需要查看参数的返回的数据,只需要直接调用即可
以以上为例,上面添加了一个-a
的参数,下面使用python_args.a
去获取该参数返回的数据
值得注意的是,如果命令行不传入参数,则返回None
如果上面没有添加某个参数,下面调用了一个未知的参数就会报错
还是以以上为例,如果使用python_args.c
,则会报错'Namespace' object has no attribute 'c'
。因为add_argument
没有添加c
这个参数