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进行基础的函数式编程的教程
Mar 31 Python
Python简明入门教程
Aug 04 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
TensorFlow用expand_dim()来增加维度的方法
Jul 26 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
3种python调用其他脚本的方法
Jan 06 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
python实现高效的遗传算法
Apr 07 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 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
PHP也可以?成Shell Script
2006/10/09 PHP
十天学会php(1)
2006/10/09 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
取键盘键位ASCII码的网页
2007/07/30 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
详解element-ui中form验证杂记
2019/03/04 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
python调用java的jar包方法
2018/12/15 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
Python 互换字典的键值对实例
2019/02/12 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
计算机专业个人求职自荐信
2013/09/21 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
春秋淹城导游词
2015/02/11 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL