Python命令行参数解析工具 docopt 安装和应用过程详解


Posted in Python onSeptember 26, 2019

什么是 docopt?

1、docopt 是一种 Python 编写的命令行执行脚本的交互语言。

它是一种语言!

它是一种语言!

它是一种语言!

2、使用这种语言可以在自己的脚本中,添加一些规则限制。这样脚本在执行的时候就必须按照这样格式来执行,同时,也可以很方便的编写一些帮助信息(其实很多软件在输入 -h 的时候显示信息 、例如 python -h ,会显示所有的 python 指令,并且页通过 docopt 限制了 python 指令的格式),下面是一些简单的例子:

docopt 的安装

docopt 有很多把版本,分别支持不同的语言,最简单就是支持 python 语言,docopt.java 支持 java脚本,docopts 则是支持 shell 脚本的(下面的例子主要事以 docopts 为例)

1、安装 docopt

方法一:

pip install docopt

方法二:

也可以在 github 上下载源码(docopt 是开源项目),然后通过 Python setup.py install 安装

2、安装 docopts 就必须使用上面的安装docopt 的方法二来进行安装,然后使用 python 安装,下载地址:

https://github.com/docopt/docopts

docopt 实现简单分析

在 Python 中有这么一个属性__doc__ , 它的值是字符串,一般表示帮助信息,而 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 ,同时还可以把多个单字母的选选项合并, -ov 等同于 -o, -v, -i.。选项也能 

参数,此时别忘了给选项添加描述说明

接下来时使用模式中用到的一些标识的含义,正确的使用他们能够更好的完成解析任务:

* []

代表可选的元素,方括号中的元素可有可无

*()

代表必要有的元素,括号内的元素必须要有,哪怕时多个里面选一个

*|

互斥的元素,竖线两旁的元素只能有一个留下

* ....

代表元素可以重复出现,最后解释的结果时一个列表

*[options]

指定特定的选项,完成特定的任务。

选项描述格式(Options description format)

选项描述同样必不可少,尤其时方选项有参数,并且还需要为它赋默认值时。

为选项添加参数的格式有两种:

  • -o FILE --output -FILE # 不是用逗号, 使用 = 符号
  • -i <file>, --input <file> # 使用逗号, 不使用 = 符号

为选项添加描述说明,只需要用两个空格分割选项和说明即可

为选项添加默认值时,把它添加到选择描述后面即可,格式如下【defailt: <my-default-value>】

--coefficient=K The K coefficient [default: 2.95]
--output=FILE Output file [default: test.txt]
--directory=DIR Some directory [default: ./]

如果选项时可以重复的,那么它的值 [default: ...] 将会是一个列表,若不可以重复,则它的值时一个字符串。

使用

理解了使用模式格式 和 选项描述格式之后,在配合给出的例子就能较好的理解了;

接下来就是得到输入信息了

在前面提到 arguments 参数是一个字典类型,包含了用户输入的选项和参数信息,还是上面的代码端例子,假如我们从命令行运行的输入是

python 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 说明提示内容。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python OS模块常用函数说明
May 23 Python
python实现将文本转换成语音的方法
May 28 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
Python日期时间对象转换为字符串的实例
Jun 22 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
numpy中的ndarray方法和属性详解
May 27 Python
Python如何实现动态数组
Nov 02 Python
Python手绘可视化工具cutecharts使用实例
Dec 05 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 Python
django框架创建应用操作示例
Sep 26 #Python
Python从入门到精通之环境搭建教程图解
Sep 26 #Python
python性能测量工具cProfile使用解析
Sep 26 #Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 #Python
用python写测试数据文件过程解析
Sep 25 #Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 #Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 #Python
You might like
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
世界上最大的二手相机店:KEN
2017/05/17 全球购物
先进集体获奖感言
2014/02/13 职场文书
森林病虫害防治方案
2014/06/02 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
医院营销工作计划
2015/01/16 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
Html5生成验证码的示例代码
2021/05/10 Javascript
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电