Python中的命令行参数解析工具之docopt详解


Posted in Python onMarch 27, 2017

前言

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python读取html中指定元素生成excle文件示例
Apr 03 Python
Python编程中的反模式实例分析
Dec 08 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Python实现计算圆周率π的值到任意位的方法示例
May 08 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
解决python replace函数替换无效问题
Jan 18 Python
如何在django中添加日志功能
Feb 06 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
Apr 21 Python
python playwright之元素定位示例详解
Jul 23 Python
Python使用PDFMiner解析PDF代码实例
Mar 27 #Python
详解python并发获取snmp信息及性能测试
Mar 27 #Python
使用Python写CUDA程序的方法
Mar 27 #Python
pyenv命令管理多个Python版本
Mar 26 #Python
Django实现自定义404,500页面教程
Mar 26 #Python
Python 多线程实例详解
Mar 25 #Python
解决python3 urllib中urlopen报错的问题
Mar 25 #Python
You might like
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
php图片上传类 附调用方法
2016/05/15 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
毕业生找工作的求职信范文
2013/12/24 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
留学推荐信英文范文
2015/03/26 职场文书
养成教育工作总结
2015/08/13 职场文书