Python中的命令⾏参数解析⼯具之docopt详解
前⾔python中字符串是什么
docopt 最⼤的特点在于不⽤考虑如何解析命令⾏参数,⽽是当你把⼼中想要的格式按照⼀定的规则写出来后,解析也就完成了。
docopt的安装
docopt有很多种版本,分别⽀持不同的语⾔,最简答的docopt⽀持python脚本,docopt.java⽀持java脚本,docopts则是⽀持shell脚本的(下⾯的例⼦主要以docopts为例),具体的可以参见
安装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: ]
--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说明提⽰输⼊内容。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论