Python3命令行模块argparse简明教程

Python3自带的模块argparse是专门用于处理命令行参数,用户可编写自己需要的命令行参数,功能非常强大。

本文主要讲述其基本使用方法,Python版本是3.8.3,也可以直接参考argparse的官方文档


一 使用步骤

首先讲解下使用步骤,后面再说例子,主要分三步,

1. 创建Parser

使用类argparse.ArgumentParser,其定义如下,

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)

参数很多,但是常用的也就那么几个(粗体表示),剩下的参数使用默认值的就行了。

2. 添加命令行参数

这一步是最关键的,使用ArgumentParser的add_argument()方法

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

这个方法定义了如何解析一个单独的命令行参数

3. 解析参数

使用ArgumentParser的parse_args()方法,

ArgumentParser.parse_args(args=None, namespace=None)

一般来说,这2个参数使用默认值就可以了,我们在解析时只需要接收该函数的返回值。


二 例子

有了前面的大概认识之后,就来看看具体如何使用,通过例子可以让我们更加深刻的理解argparse的使用方法。

1 命令行参数是多个数据

也就是命令行参数是直接的数据或其它字符串这种,这样的参数叫positional arguments

'''
filename: aa.py
'''

import argparse

parser = argparse.ArgumentParser(description='Process cmdline args.')

parser.add_argument('integers', metavar='N',
					type=int, nargs='+',
					help='an integer for the accumulator')

args = parser.parse_args()

print(args.integers)

查看帮助信息,
在这里插入图片描述
本例中add_argument()的参数分析:

  • 第1个参数定义了命令行参数名,即integers
  • 第2个参数metavar是定义帮助信息里显示的参数名,如果缺失,就会直接使用命令行参数名,即integers
  • 第3个参数type用来定义命令行参数类型,这里给的int,表示只接受整型数据的命令行参数,而且解析时会自动转为整型,如果缺失,就作为string存储
  • 第4个参数nargs定义了命令行参数允许出现的次数,这里使用的是“+”,表示至少一次;如果是“*”则表示0次,1次或多次;如果是“?”,则表示最多出现一次;也可以是具体的数字,如1,2,3等。其实这里使用的是正则表达式里的符号
  • 第5个参数help用于添加命令行参数的帮助信息

运行方式:python aa.py 100 200 300

2 参数后跟值的形式

常规来说,unix风格的命令行使用的比较多点,即 "prog -arg xx"这种形式,即一个参数后面跟着参数值这种,这种参数叫optional arguments

'''
filename: aa.py
'''

import argparse

parser = argparse.ArgumentParser(description='Process cmdline args.')

parser.add_argument('-a', dest='A_value', type=int, metavar='value',
                    help='Store a simple value', default=100)

args = parser.parse_args()

print(args.AA_value)

查看帮助信息,
在这里插入图片描述

可以看到-a是用方括号包起来的,表示可有可无,不传参时就用默认值,传参的话就用传递的值。
add_argument()的参数分析,

  • 第1个参数是定义命令行参数名
  • 第2个参数dest定义解析时该命令行参数对应的变量名,如果缺失就直接使用命令行参数名
  • 第3个和第4个以及第5个参数不再赘述
  • 第6个参数default定义默认值

主要是理解dest的含义,参数解析后,会得到一个对象,这个对象里包含参数对应的值(不管是默认值还是命令行传递的值),如何拿到这个值呢?使用args.AA_value就可以拿到,如果dest缺失,那就通过args.a拿到。

使用方式:python aa.py -a 300python aa.py

PS:dest只能用于optional arguments,不能用于positional arguments,因为positional arguments已经把命令行参数名作为dest了。

前面说了,这个添加的-a参数在使用时是可有可无的,如果要求一定要在命令行出现-a参数,那就要使用required参数,如下,

parser.add_argument('-a', type=int, metavar='value', dest='A_value',
                    help='Store a simple value', required=True)

最后添加的required设置为True,表示一定要从命令行传递参数,查看帮助信息,
在这里插入图片描述
可以看到-a两边的方括号没有了,因为必须传参数,所以默认值就不需要了。

3 传递true/false值

有时想使用命令行参数来传递true/false值,如prog -b表示传了一个true,没有-b则表示传了一个false,也就是-b的默认值是false,

'''
filename: aa.py
'''

import argparse

parser = argparse.ArgumentParser(description='Process cmdline args.')

parser.add_argument('-b', action='store_true', dest='B_value',
                    help='Turn on a light')

args = parser.parse_args()

print(args.B_value)

帮助信息,
在这里插入图片描述
使用情况,
在这里插入图片描述
add_argument()里的action参数是关键,这里传递的是“store_true”,表示如果出现-b就转为True,如果没有就转成False,同样,还有其它一些值可供选择,

  • store_false:出现参数就转为False,没出现就转为True
  • store_const:出现参数就转为一个固定值,这个值由const指定
  • append: 允许出现多个同名参数,并把值存放到列表里
    … …

还有很多其它选项,可以直接参考官方文档

4 传递固定值

理解了Case3,这个就很好理解了,只是把action的值设置为“store_const”,并使用const指定值

'''
filename: aa.py
'''

import argparse

parser = argparse.ArgumentParser(description='Process cmdline args.')

parser.add_argument('-c', action='store_const', const=100, dest='C_value',
                    help='Give a value')

args = parser.parse_args()

print(args.C_value)

使用如下,
在这里插入图片描述
如果不使用-c就会传递None

5 多个同名参数

有时需要传递多个同类型的参数,这样就会出现多个同名参数,

'''
filename: aa.py
'''

import argparse

parser = argparse.ArgumentParser(description='Process cmdline args.')

parser.add_argument('-d', action='append', type=int, metavar='value', dest='D_value',
                    help='Get a value')

args = parser.parse_args()

print(args.D_value)

使用方式,
在这里插入图片描述

6 一个参数后跟多个值

使用nargs就可以了,

'''
filename: aa.py
'''

import argparse

parser = argparse.ArgumentParser(description='Process cmdline args.')

parser.add_argument('-e',  nargs='+', type=int, metavar='value', dest='E_value',
                    help='Get one or more value')

args = parser.parse_args()

print(args.E_value)

使用如下,
在这里插入图片描述

7 指定参数的取值范围

add_argument()里需要使用choice,

'''
filename: aa.py
'''

import argparse

parser = argparse.ArgumentParser(description='Process cmdline args.')

parser.add_argument('-g', type=int, metavar='value', 
                      choices=range(1, 4), dest='G_value')

args = parser.parse_args()

print(args.G_value)

这样-g后面只能出现1,2,3这三个值中的一个,
在这里插入图片描述


三 positional和optional的理解

从前面可以看到参数分成2种,positional和optional,如何理解呢?可以看下面这个函数,

def func(data1, data2, data3=100, data4=200):
	print("data1: {}".format(data1))
	print("data2: {}".format(data2))
	print("data3: {}".format(data3))
	print("data4: {}".format(data4))

func(10, 20)
print("\n")
func(20, 40, data4=50, data3=20)

参数data1和data2都是必须传值的,且位置不可变,data3和data4则可根据需要传值,也可以不传值,切位置可以变换,但是必须在data1和data2之后。

data1和data2是positional参数,data3和data4是optional参数。当然对应到命令行还是有点细微的区别

'''
filename: aa.py
'''

import argparse

parser = argparse.ArgumentParser(description='Process cmdline args.')

parser.add_argument('integers', metavar='N',
					type=int, nargs='+',
					help='an integer for the accumulator')

parser.add_argument('-f',  type=int, metavar='value', dest='F_value',
                    help='Get a value')

args = parser.parse_args()
print(args.integers)
print(args.F_value)

帮助信息如下,
在这里插入图片描述
使用如下,
在这里插入图片描述
如果-f参数的nargs设置为“+”,那么上图的第三种情况也就变的正确了。


四 总结

本文主要讲述argparse的常规使用方法,当然还有各种各样的使用方法本文没有提到,感兴趣的可以去参考官方文档。

猜你喜欢

转载自blog.csdn.net/whahu1989/article/details/108358399
今日推荐