栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

argparse模块

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

argparse模块

本文目录
  • argparse模块
    • 一、基本用法
    • 二、几个常用选项
      • 1. 可选参数(--)与默认值(default)
      • 2. action
      • 3. metavar、dest和nargs
        • (1) metavar
        • (2) dest参数

argparse模块

argparse模块是python的一个命令行解析包,可以直接让我们在命令行向程序中传入参数和修改参数,argparse模块内置于python中,不需要另外安装

试想在一个project中,我们有5个参数(p1,p2,p3,p4,p5),有两个py文件,其中py1用到了(1,2,3,4),py2用到了(1,2,3,5)但是在py1和py2中我们的参数p3的值不同。如果我们不用argparse模块,首先,我们需要在两个文件中分别定义各自的参数以及相应的值,然后运行,每次我们修改参数值的时候都需要进入到程序中进行修改,修改不便。其次,我们需要在两个文件中分别定义参数,相当于参数1,2,3多定义了一次。当我们用argparse模块时,上述的五个参数只需要定义一次,且当某个参数需要修改时我们只需要在命令行中给出他的修改值就可以了

一、基本用法

argparse官方文档

构建argparse模块主要分为四步:

  • 导入argparse模块
  • 创建ArgumentParser对象:ArgumentParser对象包含将命令行解析成python数据类型所需的全部信息
  • 添加参数:给上述创建的对象添加参数,调用add_argument()方法
  • 解析参数:将上述添加的参数进行解析,调用parse_args()方法

下面展示一个简单的例子

# 1. 导入argparse模块
import argparse


# 2. 创建ArgumentParser对象
parser = argparse.ArgumentParser()

# 3. 添加参数
parser.add_argument("number", help="请输入数字", type=int)
parser.add_argument("str", help="请输入字符串", type=str)

# 4. 解析参数
args = parser.parse_args()
print(args.number+10)
print(args.str)
'''
进入命令行,运行python example.py
输出:
usage: example.py [-h] number str
example.py: error: the following arguments are required: number, str


运行“python example.py -h”
输出:
usage: example.py [-h] number str
 positional arguments:
   number      请输入数字
   str         请输入字符串
 optional arguments:
   -h, --help  show this help message and exit
'''

python example.py上述代码中number和str是我们的变量,这个变量必须进行赋值,不赋值的化会产生如上提示错误的输出

python example.py -h查看提示信息

add_argument()help中的内容是参数的说明,type是变量的种类

python example.py 5 hello, world当我们在命令行中没有给参数值时程序无法运行,当我们给参数赋值之后,parse_args()方法会帮我们解析参数,将所有参数赋值给args,这里我们运行参数number被赋值为5,str被赋值为hello,world,下面是运行结果

15
hello,world

此时我们print(args),输出为:Namespace(number=5, str='hello,world'),可以看出args是Namespace数据类型,它是一种类似于字典的数据类型,我们可以使用args.param来提取这个参数,例如args.number

二、几个常用选项 1. 可选参数(–)与默认值(default)

上述的number和str都是位置参数(positional argument)也就是必选,若要变为可选参数,只需要在变量前加--即可

import argparse


parser = argparse.ArgumentParser()
parser.add_argument("--number", help="请输入数字", type=int)
parser.add_argument("--str", default="hello,world", help="请输入字符串", type=str)
args = parser.parse_args()
print(args)
'''
运行"python example2.py"
输出:
Namespace(number=None, str='hello,world')

运行“python example2.py --number=2 --str="nihao”
输出:
Namespace(number=2, str='nihao')
'''

可以看到我们并不需要给number和str赋值程序即可运行,此时未赋值的变量number为None,有默认值default的str为“hello,world”;当我们需要给可选参数进行赋值时,用–param=xx即可

如果我们想把可选参数变为必选,只需要在相应的语句中加入“required=True”即可,例如上述number必须提供一个数值的话parser.add_argument("--number", type=int, required=True, help="请输入数字"),此时如果在命令行中运行的时候不给number提供参数就会报错

2. action

除了上述我们直接在命令中给参数赋值之外,还有一种比较有趣的赋值方式,用到action,下面我们直接举例说明

# example.py
import argparse

parser = argparse.ArgumentParser()
# parser.add_argument('--t', help=' ', action='store_true', default=False)
parser.add_argument('--t', help=' ', action='store_true')
opt = parser.parse_args()
print(opt.t)
'''
python example.py 
输出:
False


不需要给t传入参数True or False
python example.py --t 
输出:
True

'''

也就是说action=‘store_true’,在运行时该变量不需要传入参数(且不能传入参数),只要写明该变量他就自动就变为True,如果不写该变量则为False

注意:由于有action的变量默认为False,所以如果后面加入default=False默认不变,如果加入default=True则action就失去了作用,当然这么做也就没有意义了,所以一般不加入default=True

3. metavar、dest和nargs

这三个参数仅作为学习使用,但是实际上好像用不到,可以不用看

其实我也不是很理解这三个参数的作用

(1) metavar

metavar会在用户寻求帮助信息时在命令行提供帮助信息,而不同于代码中的“help”,help对参数起到解释作用,即解释这个参数究竟是干什么的,metavar则是解释这个参数应该提供给一个什么类型的值

例如

# metavar.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo', help="a number to Sam")
parser.add_argument('bar')
parser.parse_args('X --foo Y'.split())
parser.print_help()
'''
python metavar.py
输出:
usage: metavar.py [-h] [--foo FOO] bar
 positional arguments:
   bar
 optional arguments:
   -h, --help  show this help message and exit
   --foo FOO   a number to Sam
'''

其中FOO为在没有metavar参数情况下系统的默认提示,后面的a number to Sam告诉我们foo是一个给Sam的数字

下面我们运行两个有metavar的例子

  1. 第一个例子的默认提示信息从FOO变成了YYY
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo', metavar='YYY')
parser.add_argument('bar', metavar='XXX')
parser.parse_args('X --foo Y'.split())
parser.print_help()
'''
python metavar.py
输出:
usage: metavar.py [-h] [--foo YYY] XXX
 positional arguments:
   XXX
optional arguments:
 -h, --help  show this help message and exit
 --foo YYY
'''
  1. 第二个例子narges=2表示参数foo可以接受两个参数,因此我们的提示信息也可以接受两个,其中metavar有两个参数,使用tuple元祖来表示这两个参数的信息
import argparse

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', nargs=2)
parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
parser.print_help()
'''
python metavar.py
usage: PROG [-h] [-x X X] [--foo bar baz]
 optional arguments:
   -h, --help     show this help message and exit
   -x X X
   --foo bar baz
'''
(2) dest参数

dest不同于metavar的是他不仅可以提示我们的参数信息,还可以替换原有的参数变量,在介绍此功能前,我们先介绍两个关于位置参数和可选参数的例子
上述的可选参数“–param”或者位置参数“param”实际上在被赋值时都是在向add_argument()方法中的dest关键字进行赋值,对于位置参数直接将其赋为dest关键字即可,例如下面程序直接将bar赋值为dest关键字

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('bar')
parser.parse_args(['XXX'])

此时的namespace为Namespace(bar='XXX')

上面的例子可能对dest依然不能很好的理解,下面继续解释,对于可选参数(带有“–”),与上述位置参数的程序不同,首先如果我们提供了几个参数,首选参数为第一个带有(–)的参数,即不论我们对语句中的哪个参数进行赋值,最终都是赋值给了第一个带有(–)的参数;如果参数全都是只有一个(-),那么就赋值给第一个带有(-)的参数

上面的话怎么理解呢:可以简单理解为带有--的参数具有优先赋值权。例如下面的程序,对于第一个add_argument()方法,不论我们给哪个参数赋值,最终赋值的结果都是foo_bar参数(注意:参数中含有-,由于命名规则,自动将-变为_);对于第二个add_argument()方法,不论对哪个参数赋值,都是赋值给x

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo-bar', '-foo')
parser.add_argument('-x', '-y')
a = parser.parse_args('-f 1 -x 2'.split())
print(a)
b = parser.parse_args('--foo 1 -y 2'.split())
print(b)
'''
Namespace(foo_bar='1', x='2')
Namespace(foo_bar='1', x='2')
'''

在知道add_argument()方法可以有多个参数以及最终不论哪个参数最终都是赋值给方法中的dest变量之后,我们就可以直接在方法中提供dest参数作为我们的最终变量,但是在给参数进行赋值时还是需要带有(–)的变量,例如下面程序,我们在赋值时只能够对moo进行赋值,但是在最终的Namespace空间中的的参数是bar

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--moo', dest='bar')
a = parser.parse_args('--moo 3'.split())
print(a)
parser.print_help()
'''
Namespace(bar='3')
 usage: metavar.py [-h] [--moo BAR]
 optional arguments:
   -h, --help  show this help message and exit
   --moo BAR
'''

最后我们用一个程序来加深对help,metavar和dest参数的理解
从输出中我们可以看出,help是对参数的简介,metavar也只起到对参数number的解释作用,并不会真正影响到我们最终得到的number变量的名字,而dest不一样,他不仅起到了对参数string的解释作用,并且最终还会替换掉string成为我们最终得到的number_no变量

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--number', metavar="number_yes", help="a number we need")
parser.add_argument('--string', dest='number_no')
a = parser.parse_args('--number 1 --number 3'.split())
print(a)
b = parser.parse_args('--number 1 --string 3'.split())
print(b)
parser.print_help()
'''
Namespace(number='3', number_no=None)
Namespace(number='1', number_no='3')
usage: exe.py [-h] [--number number_yes] [--string NUMBER_NO]

optional arguments:
  -h, --help           show this help message and exit
  --number number_yes  a number we need
  --string NUMBER_NO
'''
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/321376.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号