在Python中,命令行参数解析是一个重要的主题,它允许我们编写灵活且可配置的脚本。本文将深入探讨Python命令行参数的原理、技巧与实践,帮助您更好地理解和应用这一功能。
命令行参数是指在运行Python脚本时传递给脚本的字符串。这些字符串可以通过Python代码进行解析和处理,以实现不同的功能。常见的命令行参数包括位置参数、可选参数和关键字参数等。
Python提供了多种方式来解析命令行参数,包括sys.argv
、argparse
模块和getopt
模块等。其中,argparse
模块是最常用和最强大的命令行参数解析库。
首先,需要创建一个ArgumentParser对象,该对象将用于定义命令行参数的规则和行为。可以通过调用ArgumentParser类的构造函数来创建对象,如下所示:
import argparse
parser = argparse.ArgumentParser()
使用add_argument()
方法添加命令行参数。以下是用表格直观展示add_argument()
中可选参数(optional arguments)、位置参数(positional arguments)和关键词参数(keyword arguments)的区别:
参数类型 | 说明 | 示例 |
---|---|---|
可选参数(Optional Arguments) | 可选参数通常使用短选项(如-a )或长选项(如--arg )进行指定。可选参数在add_argument() 方法中使用参数名进行定义,并通过dest 参数指定存储结果的属性名。 | parser.add_argument('-a', '--arg', dest='arg', help='This is an optional argument') |
位置参数(Positional Arguments) | 位置参数没有选项标志,按照它们在命令行中出现的顺序进行解析。在add_argument() 方法中只需指定参数名即可。 | parser.add_argument('posarg', help='This is a positional argument') |
关键词参数(Keyword Arguments) | 关键词参数在命令行中使用arg=value 的语法进行指定。关键词参数在add_argument() 方法中使用参数名进行定义,并通过default 参数指定默认值。 | parser.add_argument('--kwarg', default=None, help='This is a keyword argument') |
总结:
dest
参数指定存储结果的属性名。arg=value
的方式来提供参数,使用default
参数指定默认值。示例代码:
# demo_arg.py
import argparse
parser = argparse.ArgumentParser()
# 可选参数 长选项 --batch_size | 短选项 -b | 属性名 BATCH_SIZE
parser.add_argument('--batch_size', "-b", dest="BATCH_SIZE", type=int, help='An integer parameter')
# 位置参数 没有选项标志,只需指定参数名 data_root
parser.add_argument('data_root', type=str, help='A positional parameter')
# 关键词参数 使用参数名进行定义,并通过default参数指定默认值。
parser.add_argument('--dataset', default="Mnist", help='A keyword argument')
print(parser.parse_args())
在命令行中,执行语句:
python demo_arg.py -b=2 --dataset=ImageNet /project/dataset
运行结果:
在上面的示例中,我们在命令行通过短选项-b
为可选参数batch_size
传递命令行参数,并指定BATCH_SIZE
作为可选参数在命名空间的属性名;我们在命令行通过--arg=value
的形式为关键词参数dataset传递命令行参数;通过命令行参数的位置顺序,为位置参数data_root传递命令行参数。
使用parse_args()
方法解析命令行参数。该方法将返回一个命名空间对象,其中包含了所有传递给脚本的参数值。例如:
args = parser.parse_args()
print(args.BATCH_SIZE) # 输出传递给BATCH_SIZE的参数值
print(args.data_root) # 输出传递给data_root的参数值
print(args.dataset) # 输出传递给dataset的参数值
运行结果:
action
argparse
模块中的add_argument()
方法有一个可选参数action
,它用于指定当命令行参数被解析时应该执行的操作。action
参数常见的值有2种:
'store'
(默认值):将参数值存储在目标对象中。'store_true'
和'store_false'
:将布尔值True或False存储在目标对象中,而不是参数值。如果命令行参数存在,则存储True,否则存储False。下面是使用action
参数的示例:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--batch_size', "-b", dest="BATCH_SIZE", type=int, help='An integer parameter')
parser.add_argument('data_root', type=str, help='A positional parameter')
parser.add_argument('--dataset', default="Mnist", help='A keyword argument')
parser.add_argument('--option1', action='store_true', help='Option 1')
parser.add_argument('--option2', action='store_false', help='Option 2')
args = parser.parse_args()
当命令行指令同时不指定option1和option2时,运行结果如下所示:
当命令行指令同时指定option1和option2时,运行结果如下所示:
可以看到,option1默认为False,一旦命令行指定,option1为True;option2默认为True,一旦命令行指定,option1为False;
使用type
参数可以为命令行参数设置类型转换函数
。例如:
parser.add_argument('--lr', type=float, help='A float parameter')
在上面的示例中,–lr参数将使用**float()**函数进行类型转换。
下面是一个示例脚本,演示了如何使用argparse模块解析命令行参数并打印:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--batch_size', "-b", dest="BATCH_SIZE", type=int, help='An integer parameter')
parser.add_argument('data_root', type=str, help='A positional parameter')
parser.add_argument('--dataset', default="Mnist", help='A keyword argument')
parser.add_argument('--option1', action='store_true', help='Option 1')
parser.add_argument('--option2', action='store_false', help='Option 2')
args = parser.parse_args()
args = vars(args) # vars python的内置方法
# 从下面的用法看起来vars方法是把opt搞成字典类型啦
print('------------ Options -------------')
for k, v in sorted(args.items()):
print('%s: %s' % (str(k), str(v)))
print('-------------- End ----------------')
命令行指令:
python demo_arg.py -b=2 --dataset=ImageNet /project/dataset --option1 --option2
运行结果:
通过argparse模块,我们可以轻松地解析命令行参数,实现灵活且可配置的脚本。本文详细介绍了argparse模块的原理、技巧和实践,希望能够帮助您更好地理解和应用这一功能。