命令行参数解析模块库——Argparse库

时间:2025-05-05 20:52:30

壹 简介

有时候我们需要像Linux、Windows的shell一样使用命令行操作,而不是使用编译器编译python,这时候我们就可以使用脚本传递命令参数功能。在python中,解析命令行参数的方法有很多种,比如argv、getopt、optparse、argparse等。

  • optparse库使用一种更具声明性的命令行解析方式:创建OptionParser的实例,用选项填充它,然后解析命令行。optparse允许用户以常规GNU/POSIX语法指定选项,并为您生成用法和帮助消息,但已被Python3.2、Python2.7弃用。官方文档:链接在此
  • getopt的API是来自C语言中的getopt()函数,只能简单处理命令行参数。
  • argparse库是基于optparse的,使用方法相似,从中解析参数,可编写用户友好的命令行界面,自动生成帮助和使用信息,对于无效参数可产生相应的错误提示。官方文档:链接在此
    本文主要讲argparse库的的使用,这是一个标准库,不需要下载。

贰 创建解析器对象ArgumentParser

看到这里不用懵逼,因为这个库主要是用这个对象的,所以从这里开始!

import argparse
parser = argparse.ArgumentParser(description='对该命令的描述')
  • prog:程序的名称(默认值:[0])
  • usage:条用法消息(默认值:根据参数自动生成)
  • description:对程序所做操作的描述(默认值:none)
  • epilog:参数描述后面的文本(默认值:none)
  • parents:应该将其参数复制到这个解析器中的解析器
  • formatter_class:用于打印帮助消息的HelpFormatter类
  • prefix_chars:作为可选参数前缀的字符,(默认值:’-’)
  • fromfile_prefix_chars:作为文件前缀的字符集,应从中读取附加参数(默认值:none)
    附加参数:
  • argument_default:为参数的全局默认值(默认值:none)
  • conflict_handler:指示如何处理冲突的字符串(通常是不必要的)
  • add_help:添加-h/-help选项(默认是True)
  • allow_abbrev:如果缩写是明确的,则允许缩写长选项,在版本3.5中增加的(默认值是True)
  • exit_on_error:确定发生错误时ArgumentParser是否以错误信息退出,在版本3.9中增加的(默认是True)

叁 add_argument()方法

add_argument()方法是用来指定程序需要接受的命令参数,参数可以分为定位参数和可选参数两种,这个函数根据参数多少来定义。

1、定位参数

默认是必需的,可以类比函数中不带默认值的参数,因此调用时按顺序读入的参数与设置好的定位参数一一对应,不需要添加“-”来指示参数名称,就是说必须加在命令后面的参数。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("hello")
args = parser.parse_args()
arg1 = args.hello

像这样便定义了一个hello参数,解析后的参数存放在了里,这里赋给了arg1。

2、可选参数

顾名思义,可选参数不一定需要。类比函数中带默认值的参数,但这里的命令行可选参数的默认值是真的可以有,也可以没有的,区别于函数。
设置可选参数有两种方式:

  • 1.短参数:用-加上一个字母来指定,如-v
  • 2.长参数:用–加上一个字符串来指定,如–verbosity
    上述两种方式可以共存,即同一个参数既可以有短参数形式,也可以有长参数形式。要注意的是,两种形式都有的情况下,参数对应变量名是长参数形式中的字符串。
    注意:使用命令时可选参数(长or短)若没有对应参数值会报错,这时可以添加参数action="store_true"来让程序认为该参数已出现,从而避免无参数值报错
#例子
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the  accumulator')
parser.add_argument('-s', '--sum', dest='accumulate', action='store_const',choices=[1, 2, 3, 4], const=sum, type=int, default=max, help='sum the integers (default: find the max)')
#在执行程序的时候,定位参数必选,可选参数可选,可选的参数将被识别-的前缀,而其余的参数将被认为是位置

主要:

  • default:设置参数的默认值,本例指定求最大值动作max
  • type:把从命令行输入的结果转成设置的类型,本例中为将所有设置成int
  • choice:允许的参数值,有时候参数的取值选择是有限制的,比如设置参数core对应运行并行程序所用的核心数,那么在四核机器上core的取值就只能为1、2、3、4,
  • help:参数命令的介绍,提示帮助
  • action:参数出发的动作,本例中的’store_const’操作为使用存储const关键字参数指定的值sum

理解:

  • const:指定常量值或一些动作,本例指定求和动作sum
  • nargs:指定命令行中的参数数量。一般通过整数指定个数,本例中的 ‘+’ 表示接受所有参数到一个列表中
  • metavar:指定帮助信息中的参数名称,指定帮助信息中的参数名称。本例指定 ‘N’ 为 ‘integers’ 在帮助信息中的名称
  • dest:如果提供索引,本例中的可选参数可通过来访问
  • store_const:保存一个被定义为参数规格一部分的值(常量),而不是一个来自参数解析而来的值
  • store_ture/store_false:保存相应的布尔值
  • append:将值保存在一个列表中
  • append_const:将一个定义在参数规格中的值(常量)保存在一个列表中
  • count:参数出现的次数
  • version:打印程序版本信息

3、解析——parse_args()

通过parse_args()方法默认接受的参数,返回可获取属性的namespace对象。除此之外,还可通过vars(args)方法将该对象字典化,通过字典的方式访问属性。

args = parser.parse_args()

肆 其他函数

1、.parse_known_args() 解析

此函数就是有时候一个脚本只需要解析所有命令行参数中的一小部分,剩下的命令行参数给一两个脚本或者程序。在这种情况下,parse_known_args()就很有用。它很像parse_args(),但是它在接受到多余的命令行参数时不报错。相反的,返回一个tuple类型的命名空间和一个保存着余下的命令行字符的list。意思就是说传入一些参数,与之前定义的参数匹配完后,如果还有参数,那么就返回一个tuple类型的命名空间和一个保存着余下的命令行字符的list。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--flag_int', type=float, default=0.01, help='flag_int.')
FLAGS, unparsed = parser.parse_known_args()
print(FLAGS)
print(unparsed)
#结果如下:
#$ python  --flag_int 0.02 --double 0.03 a 1
#Namespace(flag_int=0.02)
#['--double', '0.03', 'a', '1']

2、.add_mutually_exclusive_group()互斥参数组

有时我们需要两个不能同时出现的参数,比如以英尺为单位的长度参数inch和以厘米为单位的长度参数cm,这是我们可以使用互斥参数组来解决这问题。使用方法如下:

import argparse
parser = argparse.ArgumentParser(description="run a parallel program")
group = parser.add_mutually_exclusive_group()
group.add_argument("--inch", type = int, action="store_true")
group.add_argument("--cm", type = int, action="store_true")
parser.add_argument("--core", choices = [1, 2, 3, 4], help="choose the number of cores which will be used to run the proguam")
args = parser.parse_args()
arg1 = args.core

伍 使用

使用的话就是定义完后,用点隔开,引用名字

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--flag_int', type=float, default=0.01, help='flag_int.')
args = parser.parse_args()
print(args.flag_int)