文章目录
- 简介
- argparse库使用
- 简介
- `ArgumentParser()`设置整体内容
- `add_argument()`定义参数
- action属性
-
- nargs属性
- type属性
-
- choices属性
- parse_args() 方法
- add_argument_group()分组方法
- add_mutually_exclusive_group()互斥组
简介
Python可以在命令行中传参的方法当前常用的有三种,分别是
sys.argv
: 这个方法使用非常简单,但功能上的简陋不是最适合我们做项目使用的,比如他不能自动生成帮助文档(-h
),并且只能进行位置传参等因素都大大限制了他的使用场景。
import sys
sys.argv[0]
sys.argv[1]
argparse
: 这是Python自带的专门用来做命令行选项的库,功能非常强大,官方文档(基于Python3.8的版本)下面我会详细介绍此库的使用。tf.app.flags
: 这是TensorFlow这个库里带的一个命令行传参的方法,这是一个机器学习的库,并且他核心就是将argparse
库进行了二次封装。所以这个库对于大多数人来说并不是最佳选择。
argparse库使用
本博客基于argparse的python3.8版本编写。
因为此库是Python内置库之一,所以我们直接就可以引入使用,无需pip安装
from argparse import ArgumentParser
简介
argparse库中最主是其中的ArgumentParser()
对象、add_argument()
方法和parse_args()
方法, 如果我们只是想写一个简单的传参命令,只需要他们三个怎么用就完全够了。
ArgumentParser()
对象: 定义当前传参这个模块的一些整体内容,比如是否开启帮助文档,帮助文档头是什么,当前运行的程序叫什么等功能;add_argument()
方法: 定义一些我们传入的参数具体信息,比如传入的参数关键字是什么,传入的是什么类型的参数,传入参数的说明等;parse_args()
方法: 解析执行,我们输入的值就需要通过此方法来在程序了获取;add_argument_group()
方法: 参数组,建立不同的参数分组,增强帮助命令可读性;add_mutually_exclusive_group()
方法: 互斥组,同一个互斥组的参数同时只能接收到一个;format_help()
方法: 查看帮助命令(我们在捕获未知报错时try,可以方法此方法让用户自行检查是否输入错误);
注: 上述对象属于类class,可以直接调用,比如ArgumentParser()
,而方法属于函数def,需要在类的基础上调用,比如ArgumentParser().add_argument()
。
ArgumentParser()
设置整体内容
ArgumentParser参数 | 作用 |
---|
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) |
比如:
命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本")
print(命令.format_help())
PS:
- 这里如果我们没有定义usage,则上述帮助的地方会显示我们写的程序名称(prog),如果我们也没有定义程序名称,则会自动取,当前py文件的名称。
- allow_abbrev:这里的缩写指的是如果有多个参数可以同时选择,比如
-a
,-b
,-c
我们都需要选择的时候可以缩写成-abc
- parents: 这个命令类似继承,如果他可以让另一个命令行解析器继承我们之前定义的解析器的参数。比如如下所示(如果想使用parents继承,最好将自动生成的帮助文档关闭,否则可能会出现参数重复导致报错!)
命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本", add_help=False)
命令.add_argument('-h', '--帮助', action='help', help='查看帮助信息')
备用命令 = ArgumentParser(parents=[命令], add_help=False)
print(备用命令.format_help())
add_argument()
定义参数
add_argument参数 | 作用 |
---|
name or flags | 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。 |
action | 当参数在命令行中出现时使用的动作基本类型。 |
nargs | 命令行参数应当消耗的数目。 |
const | 被一些 action 和 nargs 选择所需求的常数。 |
default | 当参数未在命令行中出现时使用的值。 |
type | 命令行参数应当被转换成的类型(默认我们传入的参数会被定义为str 字符型)。 |
choices | 可用的参数的容器。 |
required | 此命令行选项是否可省略 (仅选项可用)。 |
help | 一个此选项作用的简单描述。 |
metavar | 在使用方法消息中使用的参数值示例。 |
dest | 被添加到 parse_args() 所返回对象上的属性名。 |
基础传参:
命令 = ArgumentParser()
命令.add_argument('位置传参', help='这是最基础的位置传参')
命令.add_argument('-a', '--关键字传参', help='这是最基础的位置传参')
print(命令.parse_args())
ps:
- 默认情况下位置参数是必须传输的,关键字参数是可以选填的,可以使用
required
参数来改变此状态! - 我们在程序中可以调用这些参数的值,比如
%(default)s
, %(type)s
,除了add_argument()
参数外,还有%(prog)s
也可以直接调用!
action属性
action属性可选值 | 含义 |
---|
store | 存储当前的参数值(默认动作) |
store_const | 存储被 const 命名参数指定的值 |
store_true和store_false | 这两个属性是将 const 已经预设成布尔值的 store_const 属性(action=store_true 相当与action='store_const', const=True, default=False ) |
extend | 这会存储一个列表,并将每个参数值加入到列表中。 |
append | 存储一个列表,并且将每个参数值追加到列表中。 |
append_const | 存储一个列表,并将 const 命名参数指定的值追加到列表中。 |
count | 计算一个关键字参数出现的数目或次数。 |
help | 打印所有当前解析器中的选项和参数的完整帮助信息,然后退出。 |
version | 打印版本信息并退出。 |
PS:
const
和default
都可以看成默认值,他们的区别是,如果当前属性被调用,而每个给值,则会使用const
,如果没有调用则会使用default
值
比如:
命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本",
add_help=False)
命令.add_argument('-h', '-帮助', '--help', action='help', help='查看帮助信息')
命令.add_argument('-a', '--全部', help='开启全部测试(默认开启)', action='store_true')
命令.add_argument('-m', '--模块', help='使用绕过的模块', action='store_const', const=[1, 2, 3, 4])
命令.add_argument('-u', '--url', help='目标的URL地址,比如http://127.0.0.1/')
命令.add_argument('-t', help='具体要扫描的目标,比如/index(默认:/)', dest="目标")
命令.add_argument('-v', '--版本', action='version', help='查看当前版本', version='%(prog)s 0.1 版本')
print(命令.parse_args(), 命令.parse_args().模块, 命令.parse_args().目标)
自定义action属性
我们可以自定义的action的规则,重写此规则我们可以继承from argparse import Action
后重写def __init__
和def __call__
这两个方法,我们主要在call中处理传入值,这里我也主要介绍call。
call属性 | 作用 |
---|
parser | 输出ArgumentParser() 对象 |
namespace | 相当于ArgumentParser().parse_args() 参数的返回值,显示所有用户输入的参数 |
values | 显示当前指定属性接收的内容 |
option_string | 显示当前指定的属性 |
比如这里我定义了一个规则,查看用户输入的url是否是http开头的的,如果不是就添加上,并推荐用户下次使用http开头的完整网址
from argparse import ArgumentParser, Action
class url规则(Action):
def __call__(self, parser, namespace, values, option_string=None):
if values.rfind('http'):
print('推荐在网站前面加入http://或者https://')
url地址 = 'http://' + values
setattr(namespace, self.dest, url地址)
命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本",
add_help=False)
命令.add_argument('-u', '--url', help='目标的URL地址,比如http://127.0.0.1/', action=url规则)
nargs属性
nargs属性可接收的值可以为
一个整数
: 需要参数的数量*
: 传入0位以上的参数+
: 传入1位以上的参数(如果出现0位会报错)?
: 传入0到1位参数,(这种方法经常会配合文件传输使用)argarse.REMAINDER
: 接收所有未被受用的参数
这一部分的示例我放在和type
属性一起进行展示!
type属性
属性参数中,除了可能会用到Python自带的整数型int
,浮点型float
,列表list
等外,我们还可以使用open
将接受类似设置为文件。
除此之外,我们还可以使用argparse.FileType()
来进行对文件的更高阶的操作,他的功能和原版open类似,接受mode
, bufsize
, encoding
和 errors
等 open()
函数参数。
命令 = ArgumentParser()
命令.add_argument('-a', '--关键字传参', nargs='*', type=list)
命令.add_argument('-i', '--整数', nargs='+', type=int)
命令.add_argument('-f', '--文件', nargs='?', type=open)
print(命令.parse_args())
自定义type属性
我们可以给type一个函数,然后在函数内自定义我们的类型属性!比如这里我就自动判断目标输入的是一个文件,还是一个字符串,如果是文件则将文件内容读取出来并返回
def 文件或字符识别(文本):
if len(文本) - 文本.rfind('.txt') == 4:
try:
with open(文本) as 文件:
文本 = 文件.read()
return 文本.split('\n')
except:
return [文本]
else:
return [文本]
命令 = ArgumentParser()
命令.add_argument('-t', dest="目标", nargs='*', type=文件或字符识别)
print(命令.parse_args())
PS: 需要注意的是,如果我们一次性接收多个目标,每个目标都会单独的被type属性执行一遍!
choices属性
命令 = ArgumentParser()
命令.add_argument('-l', dest="等级", type=int, choices=range(1, 4))
print(命令.parse_args())
选择属性,如果我们需要用户在已经预设好的目标中选择,即可使用这个属性
parse_args() 方法
这个方法主要在我们接收调用的时候会用到,比如我们当前想要获取用户输入的等级值,即可使用命令.parse_args().等级
,我们也可以通过直接向此方法中传参的方式来达到命令行传参的效果。
命令 = ArgumentParser()
命令.add_argument('-l', dest="等级", type=int, choices=range(1, 4))
print(命令.parse_args(['-l', '1']))
print('当前等级:', 命令.parse_args().等级)
add_argument_group()分组方法
在使用命令的时候,我们对不同的命令可能需要进行分组,比如必填命令,选填命令之类的。
比如:
命令 = ArgumentParser(prog='程序名字', usage='用来测试的python程序', description="↑帮助文档之前显示的文本", epilog="↓在帮助文档之后显示的文本", add_help=False)
必填命令 = 命令.add_argument_group('必填命令', '这里的命令是必须填写的')
选填命令 = 命令.add_argument_group('选填命令', '有默认值或非必要信息')
其他命令 = 命令.add_argument_group('其他命令', '本程序相关信息')
其他命令.add_argument('-h', '--帮助', action='help', help='查看帮助信息')
选填命令.add_argument('-a', '--全部', help='开启全部测试(默认开启)', action='store_true')
必填命令.add_argument('-u', '--url', help='目标的URL地址,比如http://127.0.0.1/')
必填命令.add_argument('-t', help='具体要扫描的目标,比如/index(默认:/)', dest="目标")
其他命令.add_argument('-v', '--版本', action='version', help='查看当前版本', version='%(prog)s 0.1 版本')
print(命令.parse_args())
add_mutually_exclusive_group()互斥组
命令 = ArgumentParser()
互传组 = 命令.add_mutually_exclusive_group()
互传组.add_argument('-t', dest="目标")
互传组.add_argument('-f', dest="文件")
print(命令.parse_args())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)