argparse是Python标准库中推荐使用的命令行解析模块,

其前身是optparse库,从Python 2.7开始,optparse库被弃用,

替代它的就是argparse库,除此之外,标准库中的getopt库也提供了相似的功能。

一个命令行的工具应该满足以下几个要求:

  • 命令可以不带任何可选参数运行,即提供默认可选参数
  • 可以提供指定可选参数覆盖默认值
  • 提供一小段帮助文档,可以通过命令直接获取

基本使用

首先从一个不带任何参数的脚本开始,新建一个脚本,输入以下内容:

# argtest1.py

import argparse
parser = argparse.ArgumentParser()
parser.parse_args() # ----------------
# 测试脚本
# ---------------- # 直接执行命令没有任何作用
$ python argtest1.py # --help参数显示基本用法
$ python argtest1.py --help
usage: argtest1.py [-h] optional arguments:
-h, --help show this help message and exit # 提供错误的可选参数
$ python argtest1.py --verbose
usage: argtest1.py [-h]
argtest1.py: error: unrecognized arguments: --verbose # 提供错误的位置参数
$ python argtest1 foo
usage: argtest1.py [-h]
argtest1.py: error: unrecognized arguments: foo

从上面可以看出,argparse模块提供了两个个基本功能:

  • --help-h参数显示基本用法
  • 对于错误的位置参数或可选参数给出提示

注:这里的位置参数就相当于函数中的位置参数和关键字参数

参数添加

为命令行工具添加参数可以使用ArgumentParser.add_argument方法,

然后可以在脚本中调用ArgumentParser.parse_args方法获取脚本执行时设置的参数值

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: actionnargs所使用的一个常量值
  • default: 当参数在命令行中不存在时的默认值,注意,这里是不存在时的默认值,而不是没有指定值时的默认值
  • type: 参数的数据类型,可以用来对命令行参数进行数据检查,默认读取的参数值都是字符串
  • choices: 参数的可选值列表
  • required: 参数是否必须,对于位置参数来说,默认为True,而可选参数默认值为False
  • help: 参数简介,会在-h/--help指令下显示出来
  • metavar: 在用法简介帮助信息里的参数名称
  • dest: 参数在ArgumentParser.parse_args方法返回值中的属性名

接下来就来分别看一下位置参数与可选参数的使用方法

位置参数

# argtest2.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('square', help='计算给定值的平方值', type=int)
args = parser.parse_args()
print(args.square**2) # ----------------
# 测试脚本
# ---------------- $ python argtest2.py -h
usage: argtest2.py [-h] square positional arguments:
square 计算给定值的平方值 optional arguments:
-h, --help show this help message and exit $ python argtest2.py 4
16 # 给出错误类型的参数
$ python argtest2.py four
usage: argtest2.py [-h] square
argtest2.py: error: argument square: invalid int value: 'four'

可选参数

# argtest3.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose',
help='控制输出的可见性', action='store_true')
args = parser.parse_args()
if args.verbose:
print('可见性打开') # ----------------
# 测试脚本
# ----------------
$ python argtest3.py -v
可见性打开 $ python argtest3.py
  • 添加可选参数的时候,可以提供一个短参数选项(-v)和一个长参数选项(--verbose),也可以省略短参数
  • action='store_true表示参数值储存为True,即在命令行中提供参数时parser.parse_args获取的参数值为True,否则为False

同时使用位置参数、可选参数

# argtest4.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('square', type=int, help="计算给定值的平方值")
parser.add_argument('-v', '--verbose', type=int, choices=[0, 1, 2],
default=0, help="如何显示输出结果")
args = parser.parse_args()
answer = args.square**2 if args.verbose >= 2:
print('{}的平方值是{}'.format(args.square, answer))
elif args.verbose >=1:
print('{}^2 = {}'.format(args.square, answer))
else:
print(answer) # ----------------
# 测试脚本
# ---------------- $ python argtest4.py --help
usage: argtest4.py [-h] [-v {0,1,2}] square positional arguments:
square 计算给定值的平方值 optional arguments:
-h, --help show this help message and exit
-v {0,1,2}, --verbose {0,1,2}
如何显示输出结果 $ python argtest4.py -v 0 4
16 $ python argtest4.py 4
16 $ python argtest4.py -v 1 4
4^2 = 16 $ python argtest4.py -v 2 4
4的平方值是16

冲突选项

有些选项的作用相反,不可以同时使用,为了加上这样的限制,

可以使用ArgumentParser.add_mutually_exclusive_group方法

# argtest5.py

import argparse

parser = argparse.ArgumentParser(description='计算给定基数的幂')
group = parser.add_mutually_exclusive_group()
group.add_argument('-v', '--verbose', action='store_true')
group.add_argument('-q', '--quiet', action='store_true')
parser.add_argument('x', type=int, help='基数')
parser.add_argument('y', type=int, help='幂数')
args = parser.parse_args()
answer = args.x**args.y if args.quiet:
print(answer)
elif args.verbose:
print('{}的{}次幂等于{}'.format(args.x, args.y, answer))
else:
print('{}^{} = {}'.format(args.x, args.y, answer)) # ----------------
# 测试脚本
# ---------------- $ python argtest5.py -h
usage: argtest5.py [-h] [-v | -q] x y 计算给定基数的幂 positional arguments:
x 基数
y 幂数 optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet $ python argtest5.py 4 2
16 $ python argtest5.py 4 2 -q
16 $ python argtest5.py 4 2 -v
4的2次幂等于16 $ python argtest5.py 4 2 -qv
usage: argtest5.py [-h] [-v | -q] x y
argtest5.py: error: argument -v/--verbose: not allowed with argument -q/--quiet

参考链接: https://docs.python.org/3/howto/argparse.html

argparse 使用指南的更多相关文章

  1. Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕获sys.exit()调用 optparse argparse

    Python第十天   print >> f,和fd.write()的区别    stdout的buffer  标准输入 标准输出  从控制台重定向到文件  标准错误   重定向 输出流和 ...

  2. python 中argparse 实例解析

    一 概念: argparse是python的一个命令行解析包.它可以使写用户友好的命令行接口变得非常容易.该模块定义什么参数是需要的,并且能指出怎么解析sys.argv的参数.它也可以自动的生成帮助和 ...

  3. 聊天机器人(chatbot)终极指南:自然语言处理(NLP)和深度机器学习(Deep Machine Learning)

    在过去的几个月中,我一直在收集自然语言处理(NLP)以及如何将NLP和深度学习(Deep Learning)应用到聊天机器人(Chatbots)方面的最好的资料. 时不时地我会发现一个出色的资源,因此 ...

  4. Python 编码风格指南

    原文:http://python.jobbole.com/84618/ 本文超出 PEP8 的范畴以涵盖我认为优秀的 Python 风格.本文虽然坚持己见,却不偏执.不仅仅涉及语法.模块布局等问题,同 ...

  5. (转载)PyTorch代码规范最佳实践和样式指南

    A PyTorch Tools, best practices & Styleguide 中文版:PyTorch代码规范最佳实践和样式指南 This is not an official st ...

  6. 一份从入门到精通NLP的完整指南 | NLPer

    该小博主介绍 本人:笔名zenRRan,方向自然语言处理,方法主要是深度学习. 未来的目标:人工智能之自然语言处理博士. 写公众号目的:将知识变成开源,让每个渴求知识而难以入门人工智能的小白以及想进阶 ...

  7. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  8. UE4新手之编程指南

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...

  9. JavaScript权威指南 - 对象

    JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...

随机推荐

  1. 【解决】docker 容器中 consul集群问题处理

    现象描述:   node1 和node2 日志反复出现 add remove node3节点. node3 节点 一直 驳回 node1 和node2 认为node3已经dead的消息  不断重启se ...

  2. jQuery的封装

    封装,最简单的效果就是一个效果你可以重复的去调用   本来前端之路时间不是很长,但是对封装还是有一点点自己个人的理解,曾经踩过的坑也不在少数,最后总结出我个人风格的封装,听一位大神指点过,每个人都有属 ...

  3. Apache httpd Server 配置正向代理

    背景 代理(Proxy),位于客户端与实际服务端之间,当客户端需要请求服务端内容时,先向代理发起请求,代理将请求转发到实际的服务器,再原路返回.也可以在代理服务器设置缓存,将实际服务器上不常变化的内容 ...

  4. Java学习笔记五:Java中常用的运算符

    Java中常用的运算符 运算符是一种“功能”符号,用以通知 Java 进行相关的运算.譬如,我们需要将变量 score 的值设置为 20 ,这时候就需要一个“=”,告诉程序需要进行赋值操作. Java ...

  5. C语言Windows程序开发—TextOut函数介绍【第02天】

    (一)TextOut函数的参数介绍: BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE HDC hdc, //用于显示字符串的控件ID int nXStart, ...

  6. POJ1236 tarjan

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19613   Accepted: 77 ...

  7. Spring 的好处?

    1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监 ...

  8. JSON初体验(二):Gson解析

    今天,我们来介绍一下Gson的jar包的用法. JSON解析之Gson 特点:编码简介,谷歌官方推荐 数据之间的转换: 1.将json格式的字符串{}转换成为java对象 API: <T> ...

  9. Android面试收集录 文件存储

    1.请描述Android SDK支持哪些文件存储技术? 使用SharePreferences保存key-value类型的数据 流文件存储(openFileOutput+openFileInput或Fi ...

  10. shell eval命令使用

    eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令. 该命令适用于那些一次扫描无法实现其功能的变量.该命令对变量进行两次扫描. 这些需要进行两次扫描的变量有时被称为复杂变量.不过这些变量本 ...