Argparse模块常见用法


argparse模块是Python中用来读取命令行参数的模块,程序定义它需要的参数,然后argparse会自动从sys.argv中解析出这些参数。

一、创建一个解释器

1
2
3
import  argparse

parser=argparse.ArgumentParser(description="Test")

接着我们试试执行该程序,使用-h参数打印帮助文档:

1
2
3
4
5
6
7
8
9
10
11
python main.py -h

'''
usage: main.py [-h]

Test

optional arguments:
-h, --help show this help message and exit

'''

description是在帮助文档解释参数前提供的文本信息。

在官方文档中,给出了ArgumentParse对象的参数解释:

  • prog - 项目名称 (default: os.path.basename(sys.argv[0]))
  • usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
  • description - 在参数帮助文档之前显示的文本(默认值:无)
  • epilog - 在参数帮助文档之后显示的文本(默认值:无)
  • parents - 一个 ArgumentParser 对象的列表,它们的参数也应包含在内
  • formatter_class - 用于自定义帮助文档输出格式的类
  • prefix_chars - 可选参数的前缀字符集合(默认值: ‘-’)
  • fromfile_prefix_chars - 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值: None
  • argument_default - 参数的全局默认值(默认值: None
  • conflict_handler - 解决冲突选项的策略(通常是不必要的)
  • add_help - 为解析器添加一个 -h/--help 选项(默认值: True
  • allow_abbrev - 如果缩写是无歧义的,则允许缩写长选项 (默认值:True
  • exit_on_error - 决定当错误发生时是否让 ArgumentParser 附带错误信息退出。 (默认值: True)

二、为解释器添加参数

此时需要使用parser的add_argument方法,以下是常见用法:

1
2
3
4
parser.add_argument('-n','--name',default="Torture")
parser.add_argument('-u','--university',default="UCAS",help="发生什么事了")

print(parser.parse_args())

可以通过打印parser.parse_args()来查看当前的解释器参数状态:

1
2
3
'''
Namespace(name='Torture', university='UCAS')
'''

执行命令python main.py -h查看帮助文档:

1
2
3
4
5
6
7
8
9
10
11
'''
usage: main.py [-h] [-n NAME] [-u UNIVERSITY]

Test

optional arguments:
-h, --help show this help message and exit
-n NAME, --name NAME
-u UNIVERSITY, --university UNIVERSITY
发生什么事了
'''

我们发现,现在的参数有三个了。可以通过-h,-n,-u来调用这些参数。关于add_argument方法,第一个参数是用于存放名称或选项字符串的。前面一个参数-u是简化的输入,只有-前缀会被以选项进行识别,剩下的参数都会被假定为位置参数。所以,--university则是该参数的名称。当然通过-u或是--university都能往该参数中输入。

default是默认值参数,用于设定默认值的,而help则是在帮助文档中用来描述该参数。

指定参数动作

1
parser.add_argument('-f','--foo',action='store')

action用来指定动作,"store"是默认值,用于存储参数。

1
2
3
4
5
python main.py -f 10

'''
Namespace(foo='10')
'''

也可以指定存储布尔型。

1
2
3
parser.add_argument('-f','--foo',action='store_true')

# Namespace(foo=False)

append是存储一个列表,并将每个参数的值追加:

1
2
3
4
5
parser.add_argument('-f','--foo',action='append')

print(parser.parse_args('-f 1 -f 2 -f 3'.split()))

# Namespace(foo=['1', '2', '3'])

指定版本信息

1
2
3
parser=argparse.ArgumentParser(description="Test",prog="ARGPARSE")

parser.add_argument('-v','--version',action='version',version='%(prog)s 2.0')

通过指定version动作和version参数进行输出:

1
2
3
python main.py -v

# ARGPARSE 2.0

指定参数类型

type参数可以指定类型,一般读进来的参数是字符串,此时可以通过type参数转换到需要的格式

例如:

1
2
3
4
5
6
parser=argparse.ArgumentParser(description="Test",prog="ARGPARSE")

parser.add_argument("-d",'--data',type=int)
parser.add_argument('-f','--float',type=float)
parser.add_argument('-p','--path',type=open)
parser.add_argument('-c','--code',type=ord)

输入参数:

1
python main.py -d 10 -f 10.658 -p 1.txt -c 't'

得到的结果为:

1
Namespace(data=10, float=10.658, path=<_io.TextIOWrapper name='1.txt' mode='r' encoding='cp936'>, code=116)

指定参数数量

通过nargs参数可以关联不同数目的命令行参数到单一的动作,支持的值有:

N

  • 整数,命令行中的N个参数会被聚集到一个列表中。

  • 例如:

    1
    2
    3
    4
    parser.add_argument("-d",'--data',nargs=2)
    parser.add_argument('-f','--float',nargs=1)

    print(parser.parse_args("-d 1 2 -f 1.0".split()))
  • 结果如下:

    1
    Namespace(data=['1', '2'], float=['1.0'])

+

  • 至少有一个值被加入参数
  • 没有的话会报错

?

  • 至少有零个值被加入参数
  • 没有的话会调用default值

三、获取参数

我们可以定义一个载入的函数:

1
2
3
4
5
6
def arg_parse():
parser=argparse.ArgumentParser(description="Test",prog="ARGPARSE")

parser.add_argument("-d",'--data',nargs=2)
parser.add_argument('-f','--float',nargs=1)
return parser.parse_args()

注意将parser返回回来

然后可以通过该函数获取参数信息了

1
2
3
4
5
6
7
arg=arg_parse()
print("data :",arg.data)

'''
python main.py -d 1 2 -f 3.2
data : ['1', '2']
'''

更多内容详见官方文档:https://docs.python.org/zh-cn/3/library/argparse.html#the-add-argument-method.