Python学习笔记-argparse模块
阅读原文时间:2023年07月09日阅读:1

Python学习笔记-argparse模块

optparseargparse

昨天学习了一个简单的端口扫描器的脚本,其中涉及到了optparse模块,网上关于此模块的介绍已有很多,但这个模块已经不更新了,新的模块叫argparse。百度学习了argparse的用法后,这里简单比较一下二者,仅为加深自己的理解

一、optparse

optparse模块用于解析命令行,可以自己定制程序的参数选项控制。

optparse支持一般性GUN的选项方法,包括:

1.无参数选项, -v
2.有参数项,   -p value, -para=value
3.值参一体,   -pvalue(不支持长参数)
4.合并选项,   -abc,-abcp value(最后一个可以是有参,其余均无参)

解析时,- 和 --的区别:

  • - 看后面的值,如果时无参的,继续下一个;有参, 就把参数读进来;

  • -- 直接读后面的值;

    1.载入OptionParser类,新建对象:OptionParser()
    2.添加选项: add_option()
    3.参数解析: parse_args()

举个例子:

import optparse
from optparse import OptionParser

parser=optparse.OptionParser("usage%prog "+"-H <target host> -p <target port>")
#通过OptionParser创建parser实例,初始参数usage中的%prog等同于os.path.basename(sys.argv[0]),即当前所运行的脚本的名字。
parser.add_option('-H',dest='tgtHost',type='string',help='specify target host')
parser.add_option('-p',dest='tgtPost',type='int',help='specify target post')
(options,args)=parser.parse_args()

parser=OptionParse()

形参包括:

def __init__(self,
             usage=None,
             option_list=None,
             option_class=Option,
             version=None,
             conflict_handler="error",
             description=None,
             formatter=None,
             add_help_option=True,
             prog=None,
             epilog=None):

3-1. 可以使用以下几个方法:

add_option,add_option_group,add_options.

3-2. 具体参数分析:

add_option(...):
        add_option 方法中前面的参数为命令的选项,可以为等价的短名或长名,一般是前面为短名,后面为长名。
可配置的参数为:
        dest:可以决定解析后,取值时的属性名,尤其适于多个等价参数,不指定时就是选项不加-的字符串.
        type:选项的值类型,值的默认类型是字符串,这里将值指定为其他类型.
        default:缺省值,没有设置缺省值的为None.
        help:选项中有-h 时打印的help信息.
        metavar:表示显示到help中选项的默认值;
        choices:当type设置为choices时,需要设置此值.
        const:指定一个常量值给选项,该常量值将用于后面store_const和append_const,一起合用
        action:用于控制对选项和参数的处理,像无参数选项处理,可以设置为以下几种字符串:
                "store":储存值到dest指定的属性,强制要求后面提供参数;
                "store_ture":当使用该选项时,后面的dest将设置为true,不跟参数.
                "store_false":当使用该选项时,后面的dest将设置为false.常配合"store_ture"使用一个dest时使用.不跟参数
                "append":储存值到dest指定的属性,并且是以数组的形式,必须跟参数.
                "store_const":用来存储参数为const设置的值到dest指定的属性中.常用于dest为同名2个以上选项时的处理.不跟参数
                "append_const":用来存储参数为const设置的值到dest指定的属性中.
                "count":使用后将给储存值到dest指定的属性值加1,可以统计参数中出现次数.用途不大,不跟参数.
        当action设置为store_ture/store_false时,解析参数时,如果有值时为 Ture/False,没有值时为None.
        当dest值相同时,一个action设置为store_false,另一个设置为store_ture时,解析参数时,以在后面出现的为准.

使用parse_args()对参数进行解析,默认是使用sys.argv[1:][1]作为参数,也可以传递一个命令行参数列表:parse_args(list)

parse-args()返回两个值:

  • options,它是一个对象,保存有命令行参数值。只要知道命令行参数名,如input,就可以访问其对应的值:options.input
  • args,它是没被解析的命令行参数的列表。

二、argparse

argparse模块可以轻松编写用户友好的命令行界面。该程序定义了它需要的参数,argparse并将找出如何解析这些参数sys.argv

argparse模块还会自动生成帮助和用法消息,并在用户给出程序无效参数时发出错误。

举个例子:

import argparse #导入athparse模块
parser=argparse.ArgumentParser()
#创建解析器对象ArgumentParser,可以添加参数。
parser.add_argument("echo",help="echo the string")
args=parser.parse_args()
print(args.echo)

add_argument()方法,用来指定程序需要接受的命令参数

  • 定位参数:

    parser.add_argument("echo",help="echo the string")

  • 可选参数:

    parser.add_argument("--verbosity",help="increase output verbosity") 在执行程序时,定位参数必选,可选参数可选。

add_argument()常用参数

  • dest:如果提供dest,例如dest="a",那么可以通过args.a访问该参数
  • default:设置参数的默认值
  • action:参数发出的动作
  • store:保存参数,默认
  • store_const:保存一个被定义为参数规格的一部分的值(常量),而不是一个来自参数解析而来的值。
  • store_ture/store_false:保存相应的布尔值
  • append:将值保存在一个列表中
  • append_const:将一个定义在参数规格中的值(常量)保存在一个列表中
  • count:参数出现的次数
  • parser.add_argument("-v","--verbosity",action="count",default=0,help="increase output verbosity")
  • version:版本信息
  • type:把从命令行输入的结果转成设置的类型
  • choice:允许的参数值
  • parser.add_argument("-v","--verbosity",type=int,choices=[0,1,2],help="increase output verbosity")
  • help:参数命令介绍

此函数用于一个脚本只需要解析所有命令行参数的一小部分,剩下的命令行参数给一两个脚本或程序。在这种情况下,parse_known_args() 就很有用。它很像parse_args(),但是它在接受到多余的命令行参数时不报错。相反的,返回一个包含已填充名称空间和剩余参数字符串列表的两个项目元组。

比如:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
    '--input',type=int,default=0,help='input.'
)
INPUT, unparsed = parser.parse_known_args()
print(INPUT)
print(unparsed)

运行后返回:

$ python>test.py --input 1 --double 0.01 a
Namespace(input=1)
['--double', '0.01', 'a']

三、区别:

argparse模块以多种方式改进了optparse模块,包括:

  • 处理位置参数
  • 支持子命令
  • optparse.OptionParser.add_option()调用替换所有ArgumentParser.add_argument()调用。
  • 更换(options, args) = parser.parse_args()args = parser.parse_args()并添加额外ArgumentParser.add_argument()的定位参数调用。
  • 其它的用到再补充。