python功能驱动,详解argparser模块的使用播报

python功能驱动,详解argparser模块的使用播报,第1张

python功能驱动,详解argparser模块的使用播报

我们知道,在windows、linux、macos这样一些 *** 作系统中,除了提供一些傻瓜式的用户界面方便用户 *** 作外,这些系统很大程度上都留给一些系统爱好者(或深度学习的用户)一些命令行接口。

cmd和shell
通过一些简单的系统命令,实现同界面一样的 *** 作效果,甚至可以实现一些用户界面无法实现的功能。

01
不同系统的命令行工具
不同系统命令行调用方式存在差异。

【Windows系统】

windows系统
对于windows用户,按下“win” + ‘r’键,在d出对话框中输入cmd,可以进入这样的交互界面。比如,你想要查看当前windows系统中所有端口占用情况,可以使用下面的命令:

netstat -ano

命令行演示
如果使用图形界面,可能获取到的信息就没这么详细了!

windows中,如果你想要更加高级的界面,在某个文件夹界面中按下“shift”,同时单击鼠标右键,同时按下“s”键(或者点击“在PowerShell中打开”这个选项),即可打开PowerShell窗口,这是一个更加高级的命令行窗口,说它高级,是因为它是一个面向对象的命令行接口。

PowerShell窗口

【linux系统】

linux系统
这里的linux系统指的是大部分linux系统:

Ctrl + Alt + t:打开一个新的终端

Shift +Ctrl + t:在已有终端上打开一个新的tab

Shift +Ctrl + n:在已有终端上打开另一个新的终端(不是tab)

这里就不再截图了,感兴趣的小伙伴自己实验下!

【其它系统】

其他os
此处略去,详情参见系统手册-

对于这些命令行工具,本质上来讲,就是调用系统中存在的一些应用程序,将程序运行结果在终端显示出来。而程序运行需要的一些参数,通过命令行的一定格式,传递给命令来执行。

命令行解析
比如,上面的“netstat -ano”这个命令。其中,a、n、o就是netstat运行时需要用户提供的参数,这里也可以分开来写,比如:netstat -a -n -o。当用户将这个命令提交给shell、cmd等终端工具时,shell、cmd就将命令发送给系统底层(可能这里还不是系统底层,暂且这样理解即可)执行,执行后系统将结果会送给shell、cmd等,shell、cmd通过其展示机制,将运行结果展示给用户。

本质来讲是个接口
Python作为一门强大的编程语言,实现这种命令行接口可以说是轻而易举。我们来看下面的内容:

02
argparse模块介绍
Python实现类似上面这种命令行接口,有一个简单易用的标准库,不用导入任何第三方库即可轻松实现,这里需要用到argparse模块,它可以让人轻松编写用户友好的命令行接口。

我们先来看一个官网的例子:

import argparse

parser = argparse.ArgumentParser(description=‘处理一些整数’)

parser.add_argument(‘integers’, metavar=‘N’, type=int, nargs=’+’, help=‘累加器的整数’)

parser.add_argument(’–sum’,dest=‘accumulate’,action=‘store_const’,const=sum,default=max,help=‘对整数求和(默认值:查找最大值)’)

args = parser.parse_args()

print(args.accumulate(args.integers))

为了便于理解,我们对相关参数说明进行了翻译。

我们将上述代码保存为“test.py”文件,在PyCharm中测试运行,看下结果

使用默认-h或–help测试结果
然后我们传入参数看下运行结果。

powershell中测试结果
从上面看,类似的程序设计步骤应该是这样的

第一步:导入模块后,定义一个ArgumentParser对象实例

第二步:使用add_argument(*args, **kwargs)方法,向该对象实例中添加参数

第三步:使用parse_args()方法解析该实例对象中的参数。

03
分步骤实现命令行接口
上面梳理了一般命令行接口程序的设计步骤,程序首先创建类的实例,然后定义它需要的参数,后argparse将弄清如何从 sys.argv 解析出哪些参数。此外,argparse模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。

功能
下面,我们逐个攻破上面涉及到的类的实例和相关方法(下文只是针对步骤对类及方法的参数进行了简要说明,)

【创建解析器对象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, exit_on_error=True)

创建一个新的 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),该参数从Python3.5开始才有。在Python3.8之前的版本中,该参数还会禁用短旗标分组,例如 -vv 表示为 -v-v。
【exit_on_error】 - 决定当错误发生时是否让 ArgumentParser 附带错误信息退出。该参数在Python3.9版本中才有 (默认值: True)
对于一般需求的应用程序,直接定义描述信息即可。但是,当我们需要自定义一些个性化的功能时,这些参数往往就显得很重要了。如何对这些参数进行个性化定制,每一个参数的含义如何?我们后续专题讲解,这里不再赘述。

类的实例定义好了,如何往实例里面添加参数信息?我们接着往下看!

【使用add_argument添加参数】

import argparse

parser = argparse.ArgumentParser(description=“XXXXXXX”)

parser.add_argument(**kwargs)

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

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

【name or flags】 - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。
【action】 - 当参数在命令行中出现时使用的动作基本类型。
【nargs】 - 命令行参数应当消耗的数目。
【const】 - 被一些 action 和 nargs 选择所需求的常数。
【default】 - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。
【type】 - 命令行参数应当被转换成的类型。
【choices】 - 可用的参数的容器。
【required】 - 此命令行选项是否可省略 (仅选项可用)。
【help】 - 一个此选项作用的简单描述。
【metavar】 - 在使用方法消息中使用的参数值示例。
【dest】 - 被添加到 parse_args() 所返回对象上的属性名。
对于add_argument方法,我们下文专题介绍,这里不再赘述了。参数添加后,我们需要完成参数的解析,这里我们要用到parse_args方法!【使用parse_args解析参数】

ArgumentParser 通过 parse_args() 方法解析参数。它将检查命令行,把每个参数转换为适当的类型然后调用相应的 *** 作。在大多数情况下,这意味着一个简单的 Namespace 对象将从命令行参数中解析出的属性构建:

【args】 - 要解析的字符串列表。 默认值是从 sys.argv 获取。
【namespace】 - 用于获取属性的对象。 默认值是一个新的空 Namespace 对象。
上面的例子中,当我们打印解析出来的args参数时,输出是这样的:

Namespace(accumulate=, integers=[1, 2, 3, -1, 5, 6])

其中,integers列表是我们传递的参数值。一般情况下,程序会自动从sys.argv中解析出参数,该方法不需要传递参数,是不是很方便?

方便
对于parse_args方法,它其实提供了很多容错机制,当用户输入内容不合法时,进行相应的处理。我们下文也会专题进行研究。这里不再赘述。

本文,我们只了解下ArgumentParser对象实例的创建、参数添加、参数解析的步骤,对于这里很重要的几个类和方法,我们下文逐个进行讲解。

下面,针对本文内容,我们利用一个实例加深下印象!

04
举个例子
我们知道,默认情况下,如果我们对帮助信息不做任何格式限定,它应该是这样的(以前面官网例子为例):

默认帮助信息格式
如果我们需要自己定制一个帮助信息文本,只需要在创建类的实例时,对prog、usage、description、epilog等这样一些参数进行定制即可。

参数定制
我们看到,这里使用参数对帮助信息进行了一些个性化调整。但是,上面内容空行太多,该如何设置去除空行呢?对这个问题,我们下次讨论创建ArgumentParser对象实例时再做介绍。

好了,今天的内容就到这里了,喜欢Python的小伙伴关注我,后续内容更加精彩。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5681556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存