目录
在类似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))
思路
如果我们需要自己写一个解析器,需要哪些功能呢?或者说我们有什么需求呢?举几个例子:
通过位置确定参数值
通过选项确定参数值
- 选项对应功能,即选项存在就运行某些代码
- 没有选项时,设置默认值
- 一个选项对应一个参数值
- 一个选项对应多个参数值
- 选项存在时,参数值只能在一个范围内选择
- 某选项必须存在
- 几个选项最多有一个(互斥)
以上功能,这个模块都能实现。基本流程如下:
- import argparse 导入模块
- parser = argparse.ArgumentParser() 创建一个解析对象
- parser.add_argument() 添加命令行选项
- 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 - 当参数在命令行中出现时使用的动作基本类型。
store
:存储参数的值。这是默认的动作store_const
:存储被const命名参数指定的值。store_true和store_false
:这些是'store_const'
分别用作存储True
和False
值的特殊用例。append
:存储一个列表,并且将每个参数值追加到列表中。使用与一个选项多次出现的情况。append_const
:这存储一个列表,并将const命名参数指定的值追加到列表中。count
:计算一个关键字参数出现的数目或次数。
- nargs - 命令行参数应当消耗的数目。
- N:N个参数形成一个列表
- ?:从命令行中消耗一个参数,并产生一个单一项。如果当前没有命令行参数,则会产生default值
- *: 所有当前命令行参数被聚集到一个列表中
- +:所有当前命令行参数被聚集到一个列表中。另外,当前没有至少一个命令行参数时会产生一个错误信息
- 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: frankyu112058@gmail.com
@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相关内容:【python总结】python学习框架梳理
本人b站账号:lady_killer9
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。