标签分类 技术文章:
当前位置:首页 > Python技术文章 > Python中的命令行参数解析工具之docopt详解

Python中的命令行参数解析工具docopt用法知识点

  • 发布时间:
  • 作者:码农之家原创
  • 点击:84

这篇文章主要知识点是关于Python、命令行、参数解析工具、docopt、Python 使用 docopt 解析json参数文件过程讲解 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Keras快速上手:基于Python的深度学习实战
  • 类型:Python大小:41.4 MB格式:PDF出版:电子工业出版社作者:谢梁
立即下载

更多Python相关的学习资源可以参阅 Python电子书程序设计电子书 等栏目。

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

前言

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 使用 docopt 解析json参数文件过程讲解

1. 背景

在深度学习的任务中,通常需要比较复杂的参数以及输入输出配置,比如需要不同的训练data,不同的模型,写入不同的log文件,输出到不同的文件夹以免混淆输出

常用的parser.add()方法非常占用代码空间,而且输入输出配置无法通过文件更改,只能通过命令行参数改变。

docopt 库提供了一个非常优雅的命令行解析工具,这边只介绍其中解析文件参数

2. 安装

pip install docopt
import docopt
import json
  

3. 使用

docopt 由两部分组成,第一部分是解析部分,通过“”“ -”“”(一段类似注释的双引号表示),这一部分必不可少。

"""
Usage: train <json_file>
"""

上面解析部分的指令很简单,输入应为:

python test.py config.json

第二部分是main 函数:

if __name__ == "__main__":
  args = docopt.docopt(__doc__)
  args = json.load(open(args["<json_file>"]))
  print('==>Params')
  for key in args.keys():
    print('\t{}:{}\n'.format(key,args[key]))
  train(args) 

我将 config.json 设置为:

{
 "dataset":    "human_science",
 "length":     1000,
 "model":     "CNN",
 "log_dir":    "./logs/",
 "output_dir":   "./output/",
 "output_prefix": "human_science_CNN",
 
 "lr":0.01
}

命令行的输出应为:

Python 使用 docopt 解析json参数文件过程讲解

成功将参数传入train()函数

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于Python的全部知识点内容总结,大家还可以在下方相关文章里找到如何由java转学python、 python ddt数据驱动实例代码、 python测试opencv时imread导致、 等python文章进一步学习,感谢大家的阅读和支持。

上一篇:python打印出所有的对象/模块的属性代码详解

下一篇:python中urlparse模块用法实例介绍

展开 +

收起 -

学习笔记
网友NO.370867

python画图软件是哪个

Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图。一般可绘制折线图、散点图、柱状图、饼图、直方图、子图等等。Matplot使用Numpy进行数组运算,并调用一系列其他的Python库来实现硬件交互。 Pylab是matplotlib面向对象绘图库的一个接口,它的语法和matlab十分相似。也就是说,它主要的绘图命令和matlab对应的命令有相似的参数。 初级绘制 绘图简介 使用matplotlib库绘图,原理很简单,如下5步: 创建一个图纸(figure) 在图纸上创建一个或多个绘图(plotting)区域(坐标系/轴,axes) 在plotting区域上描绘点、线等 为plotting添加修饰标签(绘图线上的或坐标轴上的) 其他各种DIY 相关推荐:《python视频教程》 在上面的过程中,主要就是下面三个元素: 变量 函数 图纸(figure)和坐标轴(axes) 其中,变量和函数通过改变figure和axes中的元素(例如:title,label,点和线等等)一起描述figure和axes,也就是在画布上绘图。图片结构如下所示: 如上图所示,一张图纸(figure)中有坐标轴(axes),title为图像标题,axis为坐标轴,label为坐标轴标注,tick为刻度线,tick label为刻度注释。 以上就是python画图软件是哪个的详细内容,更多请关……

网友NO.468069

Python实现的堆排序算法原理与用法实例分析

本文实例讲述了Python实现的堆排序算法。分享给大家供大家参考,具体如下: 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 具体代码如下: #-*- coding: UTF-8 -*-import numpy as npdef MakeHeap(a): for i in xrange(a.size / 2 - 1, -1, -1):#对非叶子节点的子节点进行调节,构建堆 AdjustHeap(a, i, a.size)def AdjustHeap(a, i, n): j = i*2 +1 #选择节点i的左子节点 x = a[i] #选择节点的数值 while j n: #循环对子节点及其子树进行调整 if j + 1 n and a[j+1] a[j]: #找到节点i子节点的最小值 j += 1 if a[j] = x : #若两个子节点均不小于该节点,则不同调整 break a[i], a[j] = a[j], a[i] #将节点i的数值与其子节点中最小者的数值进行对调 i = j #将i赋为改变的子节点的索引 j = i*2 + 1 #将j赋为节点对应的左子节点def HeapSort(a): MakeHeap(a) #构建小顶堆 for i in xrange(a.size - 1,0, -1): #对堆中的元素逆向遍历 a[i], a[0] = a[0], a[i] #将堆顶元素与堆中最后一个元素进行对调,因为小顶堆中堆顶元素永远最小,因此,输出即为最小元素 AdjustHeap(a, 0, i) #重新调整使剩下的元素仍为一个堆if __name__ == '__main__': a = np.random.randint(0, 10, size = 10) print "Before sorting..." print "---------------------------……

网友NO.950094

快速入手Python字符编码

前言 对于很多接触Python的人而言,字符的处理和语言整体的温顺可靠相比显得格外桀骜不驯难以驾驭。 文章针对Python 2.7,主要因为3对的编码已经有了很大的改善并且实际原理一样,更改一下操作命令即可。 了解完本文,你可以轻松解决文字处理,特殊平台(Windows?)下的编码,爬虫编码等问题。 阅读建议 本文分为如下几个部分: 1.原理 2.具体操作 3.建议的使用习惯 4.疑难问题解答 如果想要了解我给出的使用习惯,可以直接跳到建议的使用习惯。 如果只想要解决相关问题可以直接跳到疑难问题解答。 希望本文能够帮到你。 原理 为了理解方便,这里不谈理论只做类比,具体想要进一步了解各种编码的理论的百度一下好了。 首先说一下我们为什么会碰到各式各样的编码问题: 1.因为我们没有统一编码 2.因为我们没有用对命令(传对数据) 再说一下编码是什么,Python的编码看似复杂,实际上可以看做只有两类编码:Unicode,二进制 1.Unicode 相信都很熟悉 :,就是 \u0000 这样的 2.二进制编码也很简单 ,就是 \x00\x00 这样的,平常看到的 utf-8 , cp936 都是二进制编码 3.二进制编码是具象的 , 10001100 原样就可以存储,而Unicode是抽象的,不能这样存 #coding=utf8# Unicode编码演示print('Unicode:')print(repr(u'Unicode编码'))`# 二进制编码演示prin……

网友NO.117523

用Python将动态GIF图片倒放播放的方法

这次让我们一个用 Python 做一个小工具:将动态 GIF 图片倒序播放! GIF(Graphics Interchange Format) 是一种可以用来呈现动画效果的图片格式,原理就是保存很多帧(Frame)静态图像,然后连续呈现。很多简短的视频也会被转换成动态 GIF 呈现,压缩画质和去除声音之后可以有效地减小文件大小。网络上不计其数的搞笑动图,几乎承载了网友大半的欢乐,但是也有人发现,将正常的动画倒序播放往往可以获得更搞笑的效果,Reddit 上甚至有一个专门的节点:/r/reversegif。 要做到这一点其实很简单,只要从原始图片中提取中间每一帧静态图像,然后将顺序颠倒之后重新生成一张 GIF 图片即可。Python 中专门用于处理图像的库是 PIL,在 PIL 基础上由 Alex Clark 等人开发了一个更友好的版本:Pillow。于是首先来安装(或升级)Pillow: pip install --upgrade pillow -i http://pypi.douban.com/simplepython -c "import PIL; print(PIL.VERSION, '\t', PIL.PILLOW_VERSION)"// 1.1.7 3.4.2利用 Pillow 可以先读取图片文件并判断该图片是否为动态图片及其帧数:from PIL import Imagewith Image.open('ani.gif') as im:print(im.is_animated, im.n_frames) 新版本的 Pillow 提供了更多写入 GIF 的功能: im.save(out, save_all=True, append_images=[im1, im2, ...]) 通过设定 save_all=True 参数和 append_images 可以一次性将多帧图像同时存入 GIF 图……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明