argparse模块-命令行读取参数

前言:最近遇到了argparse模块的使用,一开始的时候一脸懵逼,于是找了资料终于是明白了一点,记录在下,如有错误,希望得到指正。

认识:

          举一个小例子,在命令行窗口输入python,我们可以查询到相关的python信息,但是如果我们想要进一步查看python的版本信息,那我们需要输入   python --version   ,在里  --version 被称为可选参数,我们指定了 --version 这个参数,所以最后仅仅输出python的版本信息。

         在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数。这个时候argparse模块就提供了极大地便利,比如说python脚本需要多个参数,并且每 个参数的类型不尽相同,这个时候我们就可以很方便的通过argparse模块来进行设置传递不同的参数。

一般步骤:

1. 导入argparse模块

             使用 import argparse 来导入模块

2. 创建ArgumentParser() 对象

             parser = argparse.ArgumentParser()  

             parser为创建的新对象

3. 调用 add_argument() 方法添加参数

             parser.add_argument()  

             在此函数可以对参数进行设置,比如说种类,默认值等等,下面我们会详细探讨

4. 使用 parse_args() 解析添加的参数

             args = parser.parse_args()

             args是一个namespace空间,解析的参数保存在里面

具体代码举例:

一般情况

将下面代码保存为parser.py

                  

import argparse

parser = argparse.ArgumentParser()
#分别增加两个可选参数para1、para2,类型为int
parser.add_argument('--para1', type=int, help='display an para1')
parser.add_argument('--para2', type=int, help='display an para2')
args = parser.parse_args()

if args.para1:
    print(args.para1)
else:
    print(args.para2)

运行的命令及结果:

#运行
python parser.py
#结果
None
#-----------------------------------------------------
#运行
python parser.py -h
#结果
usage: parser.py [-h] [--para1 PARA1] [--para2 PARA2]

optional arguments:
  -h, --help     show this help message and exit
  --para1 PARA1  display an para1
  --para2 PARA2  display an para2
#-----------------------------------------------------
#运行
python parser.py --para1 10
#结果
10
#-----------------------------------------------------
#运行
python parser.py --para2 50
#结果
50
#-----------------------------------------------------
#运行
python parser.py 10
#结果
usage: parser.py [-h] [--para1 PARA1] [--para2 PARA2]
parser.py: error: unrecognized arguments: 10
#-----------------------------------------------------

----------------------------------------------------------------------------------------------------

第一个输出None, 是因为我们并没有传入任何参数

----------------------------------------------------------------------------------------------------

第二个-h可以认为是自带的可选参数,输出我们增加的参数的所有信息

----------------------------------------------------------------------------------------------------

第三个我们输入 --para1 10, 意思是我们将10这个参数作为键值传入给para1存在args字典中

----------------------------------------------------------------------------------------------------

第四个我们输入 --para2 50, 意思是我们将50这个参数作为键值传入给para2存在args字典中

----------------------------------------------------------------------------------------------------

第五个输出error,是因为我们只输入了一个值,但是却没有指定这个值属于哪个参数,因而出错

----------------------------------------------------------------------------------------------------

必需参数

确保某些必需的参数有输入,我们将增加para1参数的代码改为如下所示

parser.add_argument('--para1', type=int, required=True, help='display an para1')

所得结果为:

usage: parser.py [-h] --para1 PARA1 [--para2 PARA2]
parser.py: error: the following arguments are required: --para1

位置参数:

位置参数没有 -- 标签,一般按照输入的先后顺序进行赋值,并且如果没有赋值或者赋值数量不够都会报错

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('para1', type=int, help='display an para1')
parser.add_argument('para2', type=int, help='display an para2')
args = parser.parse_args()

print('para1 is %d'%(args.para1))
print('para2 is %d'%(args.para2))

运行为:

输入:
python parser.py 10 20
结果:
para1 is 10
para2 is 20
--------------------------------------------------------
输入:
python parser.py 10
结果:
usage: parser.py [-h] para1 para2
parser.py: error: the following arguments are required: para2
--------------------------------------------------------

PS:可以使用nargs参数来限定输入的位置参数的个数,默认为1。nargs参数也可用于普通带标签的参数。

         此时多个参数值以list的形式作为键值

将para1参数改为

parser.add_argument('para1', type=int, nargs=2, help='display an para1')
#print也要修改一下,因为上述打印方式不能打印list
print(args.para1)

输出:

输入    python parser.py 10 20 30
输出
[10, 20]
para2 is 30

默认参数值

有时候我们对于不需要改动的参数不用每次都操作进行输入,我们可以借助default这个参数,给予其默认值

将代码改为如下并保存

import argparse

parser = argparse.ArgumentParser()
#此处如果是位置参数,则default参数不起作用
parser.add_argument('--para1',  type  = int ,default= 6 , help='display an para1')
args = parser.parse_args()

print(args.para1)

在命令行输入:  python parser.py

输出:      6

选择参数

这个参数值我认为很有用,将参数值的获取限定在某个范围内

编辑代码:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('para1',  type  = int ,choices = [1,2,3,4,5], help='display an para1')
args = parser.parse_args()

print(args.para1)

如果输入:    python parser.py 6

输出会出现error:    

usage: parser.py [-h] {1,2,3,4,5}
parser.py: error: argument para1: invalid choice: 6 (choose from 1, 2, 3, 4, 5)

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

疑问:关于default参数的使用,对于位置参数来说,使用default仿佛并没有起到什么作用,如果不传递值得话还是会报错

 

posted @ 2018-12-13 14:50  Freddy520  阅读(2481)  评论(0编辑  收藏  举报