0


Python-argparse命令解析模块详解与代码展示

在类似sqlmap这种命令行框架,经常敲这样的命令

python xxx.py -u http://example.com -p 80

这是怎么实现的呢?这就用到了argparse模块,本文主要讲解思路,主要将选项参数。

示例

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))


-h 选项


位置及选项参数

思路

如果我们需要自己写一个解析器,需要哪些功能呢?或者说我们有什么需求呢?举几个例子:

通过位置确定参数值

通过选项确定参数值

  1. 选项对应功能,即选项存在就运行某些代码
  2. 没有选项时,设置默认值
  3. 一个选项对应一个参数值
  4. 一个选项对应多个参数值
  5. 选项存在时,参数值只能在一个范围内选择
  6. 某选项必须存在
  7. 几个选项最多有一个(互斥)

以上功能,这个模块都能实现。基本流程如下:

  1. import argparse 导入模块
  2. parser = argparse.ArgumentParser() 创建一个解析对象
  3. parser.add_argument() 添加命令行选项
  4. parser.parse_args() 进行解析

ArgumentParser

*class *

argparse.
ArgumentParser

(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)

  • ** prog - 程序的名称(默认值: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)
    

**

add_argument

**

ArgumentParser.
add_argument

(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

  • ** name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。**
  • ** action - 当参数在命令行中出现时使用的动作基本类型。**
  1. store:存储参数的值。这是默认的动作
  2. store_const:存储被const命名参数指定的值。
  3. store_true和store_false :这些是 'store_const' 分别用作存储 TrueFalse 值的特殊用例。
  4. append:存储一个列表,并且将每个参数值追加到列表中。使用与一个选项多次出现的情况。
  5. append_const:这存储一个列表,并将const命名参数指定的值追加到列表中。
  6. count:计算一个关键字参数出现的数目或次数。
  • ** nargs - 命令行参数应当消耗的数目。**
  1. N:N个参数形成一个列表
  2. ?:从命令行中消耗一个参数,并产生一个单一项。如果当前没有命令行参数,则会产生default值
  3. *: 所有当前命令行参数被聚集到一个列表中
  4. +:所有当前命令行参数被聚集到一个列表中。另外,当前没有至少一个命令行参数时会产生一个错误信息
  • const - 被一些 action 和 nargs 选择所需求的常数。
    
  • ** default - 当参数未在命令行中出现时使用的值。**
  • ** type - 命令行参数应当被转换成的类型。**
  • ** choices - 可用的参数的容器。**
  • ** required - 此命令行选项是否可省略 (仅选项可用)。**
  • ** help - 一个此选项作用的简单描述。**
  • metavar - 在使用方法消息(-h)中使用的参数值示例。
    
  • ** dest - 被添加到 parse_args() 所返回对象上的属性名。**

位置参数

parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')

直接写参数名

metavar:使用-h或--help时,参数值示例

type:字符串转为int

nargs:所有当前命令行参数被聚集到一个列表中

help:--h的时候显示的字符串

可以输出args,当然字典形式更加的清晰。位置参数作为args的属性。

选项参数

选项对应功能,即选项存在就运行某些代码

parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

--sum存在,就运行sum函数,没有--sum选项,就运行max函数

使用-参数名或--参数名

dest:属性,这里是函数,const或default指定的函数

action:保存sum函数

const:选项存在时的值,这里是函数sum

default:默认的动作

help:显示的帮助值

一个选项对应多个参数值

parser.add_argument("-per", "--per", dest='permutations', default=[], nargs='+', help="permutations of the integers ("
                                                                                     "default: find the max)")

dest:属性名为permutations

nargs:所有当前命令行参数被聚集到一个列表

default:默认为空列表

help:-h时显示的帮助


选项参数对应多个参数值

选项必须存在

parser.add_argument("-min", "--mini", dest='min', default=[], nargs='+', required=True, help="minimum of the integers")

dest:属性名为min

default:默认为空列表

nargs:接收多个值

required:True,必须有这个选项

选项存在时,参数值只能在一个范围内选择

参数组

ArgumentParser.
add_argument_group

(title=None, description=None)

当有比官方更好的位置、选项两个分组时,可以添加新的分组,来更好的分类展示

v_group = parser.add_argument_group("v_group", "about version and verose")
v_group.add_argument("--version", dest="show_version", help="show the version")
v_group.add_argument("-v", dest="verbose", default=1, choices=[1, 2, 3, 4], help="show more information, 1~4")


参数组

参数组的使用:


结果

互斥参数组(几个选项最多有一个)

从上面可以看到,一个参数组的参数都可以存在,如果一个参数组只能存在一个呢?这就用到了互斥参数组

ArgumentParser.
add_mutually_exclusive_group

(required=False)

required为True时,代表至少有一个必须存在

csdn = parser.add_mutually_exclusive_group(required=True)
csdn.add_argument("--like", action='store_true', dest="like", help="love csdn")
csdn.add_argument("--hate", action='store_true', dest="hate", help="hate csdn")


互斥作用


互斥组一个选项

总结

  • argpase模块,将参数解析成一个字典,dest就是字典的key,你输入的就是Value
  • 多个参数值使用nargs
  • 参数值有范围,使用choices
  • 参数必须存在使用required
  • 多个参数不能同时存在,至少有一个存在可以使用互斥参数组

有其他的功能,我们可以自己对字典进行扩展和限制,不满足条件时报错。

全部代码

"""
-*- coding:utf-8 -*-
@File: learnarg.py
@Author:frank yu
@DateTime: 2021.04.06 20:45
@Contact: [email protected]
@Description:
"""
import argparse
from itertools import permutations

parser = argparse.ArgumentParser(description='a demo to learn argparse by lady_killer.')
# ----------------------- 位置参数 -----------------------
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')

# --------选项参数,一个选项一个值(存在为sum函数,不存在为max函数)----------------
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

# -------------------- 一个选项多个值,放到列表 ---------------------
parser.add_argument("-per", "--per", dest='permutations', default=[], nargs='+', help="permutations of the integers")

# ------------------ 选项必须存在,required参数 ---------------------
parser.add_argument("-min", "--mini", dest="min", default=[], nargs='+', required=True, help="minimum of the "
                                                                                             "integers,must exist")

# -------------------- 参数在范围内,choices参数 --------------------
parser.add_argument("-num", "--number", dest="num", type=int, default=1, choices=[x for x in range(10)],
                    help="a integer,0<=num<=9")

# -------------------- 参数组 --------------------
v_group = parser.add_argument_group("v_group", "about version and verose")
v_group.add_argument("--version", action='store_true', dest="show_version", help="show the version")
v_group.add_argument("-v", dest="verbose", default=1, type=int, choices=[1, 2, 3, 4], help="show more information, 1~4")

csdn = parser.add_mutually_exclusive_group(required=True)
csdn.add_argument("--like", action='store_true', dest="like", help="love csdn")
csdn.add_argument("--hate", action='store_true', dest="hate", help="hate csdn")

# ------------- 解析参数 -----------------------
args = parser.parse_args()

# -------------- 解析结果查看 --------------------
# print(dir(args))
print(args.__dict__)

# ------------- 位置参数显示 --------------------
print("位置参数:", args.integers)

# ------------ 选项参数 显示 --------------------
print("选项参数使用:", args.accumulate(args.integers))

# ----------- 选项参数,一个参数多个值 ----------
print("一个选项多个值:", [x for x in permutations(args.permutations)])

# ------------------ 必填选项 --------------
print("必填选项,最小值:", min(args.min))

# ------------ 范围限制选项 ---------------
print("范围限制选项,参数值:", args.num)

# ------------- 参数组 -------------------
if args.show_version:
    print("v1.0")
if args.verbose > 1:
    print("you will get more information")

# ----------- 互斥参数组 ------------------
if args.like:
    print("I like CSDN")
if args.hate:
    print("I hate CSDN")

参考

Python-argparse

更多python相关内容:【python总结】python学习框架梳理

本人b站账号:lady_killer9

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。


本文转载自: https://blog.csdn.net/lady_killer9/article/details/115470174
版权归原作者 lady_killer9 所有, 如有侵权,请联系我们删除。

“Python-argparse命令解析模块详解与代码展示”的评论:

还没有评论