Python中的命令行参数解析工具之docopt详解
作者:Glumes 发布时间:2021-05-15 03:17:41
前言
docopt 是一个开源的库,代码地址:https://github.com/docopt/docopt。它在 README 中就已经做了详细的介绍,并且还附带了很多例子可供学习,这篇文章也是翻译一下 README 中内容……
docopt 最大的特点在于不用考虑如何解析命令行参数,而是当你把心中想要的格式按照一定的规则写出来后,解析也就完成了。
docopt的安装
docopt有很多种版本,分别支持不同的语言,最简答的docopt支持python脚本,docopt.java支持java脚本,docopts则是支持shell脚本的(下面的例子主要以docopts为例),具体的可以参见github的docopt说明
安装docopt
以mac os x为例安装,安装docopts前首先需要安装docopt,有两种安装方法
方法一
比较简单的方法是直接用 pip 安装, pip install docopt==0.6.2
有些mac可能不支持直接pip 指令,需要先安装pip
方法二
也可以在github上下载源码(docopt是开源项目),然后通过python setup.py install
安装
安装docopts
安装docopts就必须使用上面安装docopt的方法二,在GitHub上下载源码,然后 使用python安装,下载地址
docopt 的实现简单分析
在 Python 中有这么一个属性 __doc__
,它的值是字符串,一般表示帮助信息,而 docopt 正是利用了这一属性,把帮助信息替换成命令行参数解析说明,再对它进行解析即可。
举个 docopt 中的例子来说明:
"""Naval Fate.
Usage:
naval_fate.py ship new <name>...
naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
naval_fate.py ship shoot <x> <y>
naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
naval_fate.py (-h | --help)
naval_fate.py --version
Options:
-h --help Show this screen.
--version Show version.
--speed=<kn> Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
"""
from docopt import docopt
if __name__ == '__main__':
arguments = docopt(__doc__, version='Naval Fate 2.0')
print(arguments)
上述代码段中,很大一段帮助信息就是我们的命令行参数解析说明,在函数入口处调用docopt函数进行解析,返回的arguments变量是一个字典型变量,它记录了选项是否被选用了,参数的值是什么等信息,当程序从命令行运行时,我们就是根据arguments变量的记录来得知用户输入的选项和参数信息。
所以如何写好命令行参数解析说明就变得至关重要了,命令行解析信息包含两部分,分别是使用模式格式和选项描述格式。
使用模式格式(Usage pattern format)
使用模式以usage:开始,以空行结束,如上代码段所示,它主要描述了用户添加命令行参数时的格式,也就是使用时的格式,解析也是按照此格式来进行的。
每一个使用模式都包含如下元素:
* 参数
参数使用大写字母或者使用尖括号<>围起来。
* 选项
选项以短横线开始-或者--。只有一个字母时格式-o,多于一个字母时--output。同时还可以把多个单字母的选项合并,-ovi等同于-o、-v、-i。选项也能有参数,此时别忘了给选项添加描述说明。
接下来是使用模式中用到的一些标识的含义,正确地使用他们能够更好的完成解析任务:
* []
代表可选的元素,方括号内的元素可有可无
* ()
代表必须要有的元素,括号内的元素必须要有,哪怕是多个里面选一个。
* |
互斥的元素,竖线两旁的元素只能有一个留下
* ...
代表元素可以重复出现,最后解析的结果是一个列表
* [options]
指定特定的选项,完成特定的任务。
选项描述格式(Option description format)
选项描述同样必不可少,尤其是当选项有参数,并且还需要为它赋默认值时。
为选项添加参数的格式有两种:
-o FILE --output-FILE # 不使用逗号,使用 = 符号
-i <file>, --input <file> # 使用逗号,不使用 = 符号
为选项添加描述说明,只需要用两个空格分隔选项和说明即可。
为选项添加默认值时,把它添加到选择描述后面即可,格式如下[default: <my-default-value>]
--coefficient=K The K coefficient [default: 2.95]
--output=FILE Output file [default: test.txt]
--directory=DIR Some directory [default: ./]
如果选项是可以重复的,那么它的值[default: ...]
将会一个 list列表,若不可以重复,则它的值是一个字符串。
使用
理解了 使用模式格式 和 选项描述格式 之后,再配合给出的例子就能较好的理解了。
接下来就是得到输入的信息了。
在前面提到arguments参数是一个字典类型,包含了用户输入的选项和参数信息,还是上面的代码段例子,假如我们从命令行运行的输入是
python3 test.py ship Guardian move 100 150 --speed=15
那么打印arguments参数如下:
{'--drifting': False,
'--help': False,
'--moored': False,
'--speed': '15',
'--version': False,
'<name>': ['Guardian'],
'<x>': '100',
'<y>': '150',
'mine': False,
'move': True,
'new': False,
'remove': False,
'set': False,
'ship': True,
'shoot': False}
从打印信息可以看到,对于选项,使用布尔型来表示用户是否输入了该选项,对于参数,则使用具体值来表述。
这样一来,程序就可以从arguments变量中得到下一步的操作了。若是用户什么参数都没输入,则打印Usage说明提示输入内容。
来源:http://www.glumes.com/how-to-use-docopt/


猜你喜欢
- Pyplotmatplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib。pyplot
- 文本的排版依据语言的不同会有一些格式上的要求,比如简体中文中类似逗号、分号等标点符号不会出现在一行的开头,对于英文来讲就是一个完整单词不会在
- * test11.pyimport timeprint "1"time.sleep(2)print "1&qu
- 1 插件安装想要在vscode中使用jupyter,首先我们需要在vscode中安装插件Jupyter。在拓展中搜索jupyter直接安装即
- 如何在PyCharm中安装PaddlePaddle?1.基本环境Python:3.8.5PyCharm:COMMUNITY 2019.32.
- 1.准备工作: 准备相关的软件(Eclipse除外,开源软件可以从官网下载)<1>.Microsoft SQL server 2
- functools模块是Python的标准库的一部分,它是为高阶函数而实现的。高阶函数是作用于或返回另一个函数或多个函数的函数。一般来说,对
- python闭包关于闭包, 很多blog中都这样解释 :对于一个嵌套定义的函数,外层的函数的返回值是内层函数,而在内层函数中又引用了外层函数
- 用过一段时间的caffe后,对caffe有两点感受:1、速度确实快; 2、 太不灵活了。深度学习技术一直在发展,但是caffe的更新跟不上进
- 这篇文章主要介绍了Python实现结构体代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 导言在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownLi
- 什么是运行时配置(Runtime Configuration,rc)Matplotlib使用matplotlibrc配置文件来自定义图形的各
- 引言pycharm 在运行后会产生大量的配置文件并默认存入C盘中,这样会占据大量的空间,因此,我们需要更改配置文件的位置。通过查询一些资料,
- 众所周知,随着数据库体积的日益庞大,其备份文件的大小也水涨船高。虽然说通过差异备份与完全备份配套策略,可以大大的减小SQL Server数据
- 前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控
- MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理
- tornado 里面没有 session?不,当然有~我知道 github 上肯定有人帮我写好了~ O(∩_∩)O~
- 目录精确调整工作表的行高和列宽批量更改多个工作簿的数据格式批量更改工作簿的外观格式设置字体格式修改字体为宋体修改字号字体加粗字体颜色单元格填
- <% set conn=server.createobject("adodb.connect
- Pycharm安装pywin32报错1、在pycharm的寻找并安装插件pywin32时报错大致意思是安装失败,建议的解决方案:尝试从系统终