python argparse 库

  • Post author:
  • Post category:python





argparse

— 命令行选项、参数和子命令解析器



介绍

官方文档:https://docs.python.org/zh-cn/3/library/argparse.html



argparse


模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后


argparse


将弄清如何从


sys.argv


解析出那些参数。


argparse


模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。

这个库在我们写一些安全工具的时候,比较好用并且这是一个内置库,可以简化我们的代码,和传入参数的调用,生成我们需要的使用说明。

我这里就介绍一下简单的使用,要想要深入的了解可以参考官方文档。



如何简单的使用

这个库的使用分为三步:

  1. 创建一个解析器
  2. 添加参数
  3. 解析参数


简单示例:

import argparse

def sum(a, b):
    return a + b

if __name__ == '__main__':
    # 创建一个解析器
    parse = argparse.ArgumentParser()
    # 添加参数
    parse.add_argument("-num1", type=int, help="数字1")
    parse.add_argument("-num2", type=int, help="数字2")
    # 解析参数
    args = parse.parse_args()

    # args.num1 获取 -num1的值
    print(sum(args.num1, args.num2)) # 30
    
# 使用命令调用 python nmae.py -num1 10 -num2 20

这样我们就完成了 argparse 的简单使用,想要写一个让人心情愉悦的安全工具这样肯定是不行的,我们还需要了解更多的参数来自定义我们的命令解析器。



ArgumentParser 对象

创建一个新的

ArgumentParser

对象。所有的参数都应当作为关键字参数传入。每个参数在下面都有它更详细的描述,但简而言之,它们是:

参数 说明
prog 程序的名称 (默认值:

os.path.basename(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

exit_on_error 决定当错误发生时是否让

ArgumentParser

附带错误信息退出。 (默认值:

True

)


在 3.5 版更改:

增加了

allow_abbrev

参数。


在 3.8 版更改:

在之前的版本中,

allow_abbrev

还会禁用短旗标分组,例如

-vv

表示为

-v -v


在 3.9 版更改:

添加了

exit_on_error

形参。

上面的参数我们不用全部记住,只需要记住几个常用的参数就行了,我们来优化一下我们示例的代码:

我们使用

description

参数添加一个程序说明:

import argparse

parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")



add_argument() 方法

定义单个的命令行参数应当如何解析。每个形参都在下面有它自己更多的描述,长话短说有:

参数 说明
name or flags 一个命名或者一个选项字符串的列表,例如

foo



-f, --foo
action 当参数在命令行中出现时使用的动作基本类型
nargs 命令行参数应当消耗的数目
const 被一些

action



nargs

选择所需求的常数
default 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的默认值
type 命令行参数应当被转换成的类型
choices 可用的参数的容器
required 此命令行选项是否可省略 (仅选项可用)
help 一个此选项作用的简单描述
metavar 在使用方法消息中使用的参数值示例
dest 被添加到

parse_args()

所返回对象上的属性名

同样的我们不需要全部都记住,我们只需要记住几个常用的参数即可,其中值得注意的是以下两个参数的使用:

  • action:

    action

    命名参数指定了这个命令行参数应当如何处理,以下介绍几个常用的参数。



    store_true

    and

    store_false

    :用来表示

    bool

    值,值得注意的是它们的默认值分别为

    False



    True




    append

    :存储一个列表,并且将每个参数值追加到列表中



    extend

    :这会存储一个列表,并将每个参数值加入到列表中,值得注意的是 一定要配合

    nargs="+"

    使用。

  • nargs:

    nargs

    命名参数关联不同数目的命令行参数到单一动作。


*nargs='?'

:的一个更普遍用法是允许可选的输入或输出文件:


'*'

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



'+'

:和

'*'

类似,所有当前命令行参数被聚集到一个列表中。

我们使用

add_argument()

方法添加两个命令行参数丰富我们之前的代码:

import argparse

parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")



parse_args() 方法

将参数字符串转换为对象并将其设为命名空间的属性。 返回带有成员的命名空间。

对于这个方法,没有什么补充的,使用方法也很简单,如下:

import argparse

parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")
# 
args = parser.parse_args()



如何获取我们输入的值

import argparse

parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")

args = parser.parse_args()

# 直接使用 aegs.参数名就可以调用输入的值
a = args.sum
# 如果存在输入多个值,可以使用 aegs.参数名[1] 的方式获得我们需要的值
b = args.sum[0]
c = args.sum[1]



代码示例

现在我们来完成我们上面的一个简单代码,实现两位数的加减乘除:

import argparse


# 加法
def sum(a, b):
    return a + b


# 减法
def sub(a, b):
    return a - b


# 乘法
def chenfa(a, b):
    return a * b


# 除法
def chufa(a, b):
    return a / b


if __name__ == '__main__':
    # 创建一个解析器
    parse = argparse.ArgumentParser(description="一个简单的加减乘除的运算程序!")
    # 添加参数
    parse.add_argument("-sum", type=int, action="extend", nargs="+", help="输入要进行加法的数字", )
    parse.add_argument("-sub", type=int, action="extend", nargs="+", help="输入要进行减法的数字")
    parse.add_argument("-chenfa", type=int, action="extend", nargs="+", help="输入要进行乘法的数字")
    parse.add_argument("-chufa", type=int, action="extend", nargs="+", help="输入要进行除法的数字")
    # 解析参数
    args = parse.parse_args()
    
    # 判断使用了哪些算法
    if args.sum != None:
        print(f"{args.sum[0]} + {args.sum[1]} = {sum(args.sum[0], args.sum[1])}")

    elif args.sub != None:
        print(f"{args.sub[0]} - {args.sub[1]} = {sum(args.sub[0], args.sub[1])}")

    elif args.chenfa != None:
        print(f"{args.chenfa[0]} * {args.chenfa[1]} = {sum(args.chenfa[0], args.chenfa[1])}")

    elif args.chufa != None:
        print(f"{args.chufa[0]} / {args.chufa[1]} = {sum(args.chufa[0], args.chufa[1])}")

    else:
        print("请输入正确的参数和参数值进行运算!")

其中值得注意的是如果没有在命令行中调用参数,如

args.sum

的返回结果是

None

这个库还有很多的内容是我没有讲到的,我只是讲了一下简单的运用。如果有需要或者兴趣可以去官方文档中查看相应的应用。



版权声明:本文为qq_53742230原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。