让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt

作者:HelloGitHub-Prodesire

HelloGitHub 的《讲解开源项目》系列,项目地址:https://github.com/HelloGitHub-Team/Article

一、前言

在本系列前面四篇文章中,我们介绍了 argparse 的方方面面。它无疑是强大的,但使用方式上略显麻烦。需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。

而今天要介绍的 docopt 则是站在一个全新的视角来审视命令行。你可曾想过,一个命令行程序的帮助信息其实已然包含了这个命令行的完整元信息,那么是否可以通过定义帮助信息来定义命令行呢?docopt 就是基于这样的想法去设计的。

本系列文章默认使用 Python 3 作为解释器进行讲解。
若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~

二、介绍

docopt 基于长久以来在帮助信息和手册中描述程序接口的约定,其接口描述是形式化的帮助信息。它能够根据命令行程序中定义的接口描述,来自动生成解析器。

三、快速开始

3.1 定义接口描述/帮助信息

第一步要做的就是命令行程序的定义接口描述或者是帮助信息,这样 docopt 就能知道命令行的元信息,从而自动解析。

接口描述通常定义在一个模块的文档字符串中,我们仍然以在 Python 命令行之旅:初探 argparse 的例子为例,讲解如何使用 docopt 来定义接口描述。

cmd.py 中,我们定义如下接口描述:

"""Num accumulator.

Usage:
  cmd.py [--sum] <num>...
  cmd.py (-h | --help)

Options:
  -h --help     Show help.
  --sum         Sum the nums (default: find the max).
"""

在上面的接口描述中,我们定义了命令行程序 cmd.py 接受一个或多个数字 num,而 --sum 选项则是可选,-h--help 则输出帮助信息。

若提供 --sum,则累加给定的数字;反之,取给定多个数字中最大的一个。这个业务逻辑我们将在后文实现。

3.2 解析命令行

定义好接口描述后,就可以使用 docopt 进行解析,写法非常简单:

from docopt import docopt

arguments = docopt(__doc__, options_first=True)
print(arguments)

由于我们之前是将接口描述定义在模块的文档字符串中,那么直接使用 __doc__ 即可获得接口描述。然后使用 docopt 函数即可解析命令行为参数字典。为了支持负数,我们将 options_first 设置为 True

当我们执行 python3 cmd.py --sum 1 2 3 时,将会得到如下内容:

{'--help': False,
 '--sum': True,
 '<num>': ['1', '2', '3']}

可以看到:

  • 没有提供 -h 或者 --help,所以 arguments--helpFalse
  • 提供了 --sum,所以 arguments--sumTrue
  • 提供了 <num>...1 2 3,所以 arguments<num>[‘1‘, ‘2‘, ‘3‘]

3.3 业务逻辑

获得了解析后的命令行参数,我们就可以根据自己的业务需求做进一步处理了。
在本文示例中,我们希望当用户提供 --sum 选项时,是对给定的一组数字求和;反之则是取最大值,那么就可以这么写:

nums = (int(num) for num in arguments['<num>'])

if arguments['--sum']:
    result = sum(nums)
else:
    result = max(nums)

print(result) # 基于上文的 python3 cmd.py --sum 1 2 3 参数,其结果为 6

3.4 代码梳理

使用 docopt 的方式非常简单,我们将上文的代码汇总下,以有一个更清晰的认识:

# cmd.py
# 1. 定义接口描述
"""Num accumulator.

Usage:
  cmd.py [--sum] <num>...
  cmd.py (-h | --help)

Options:
  -h --help     Show help.
  --sum         Sum the nums (default: find the max).
"""

from docopt import docopt

# 2. 解析命令行
arguments = docopt(__doc__, options_first=True)

# 3. 业务逻辑
nums = (int(num) for num in arguments['<num>'])

if arguments['--sum']:
    result = sum(nums)
else:
    result = max(nums)

print(result)

若我们需要对一组数字求和,只需执行:

$ python3 cmd.py --sum 1 0 -1
0

若我们需要对一组数字求最大值,只需执行:

$ python3 cmd.py 1 0 -1
1

我们还可以通过 -h--help 参数查看使用说明和帮助,也就是我们定义的接口描述。

四、小节

docopt 的思路非常简单,就是定义接口描述,然后帮你解析命令行为参数字典,接下来就根据这个字典来编写业务逻辑。

重点就是在于如何定义接口描述,在下一篇文章中,我们来深入了解下如何定义命令、选项、位置参数等接口描述。



『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~

原文地址:https://www.cnblogs.com/xueweihan/p/11637883.html

时间: 2024-08-10 08:20:41

让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt的相关文章

10. 通过 Dockerfile 编写 linux 命令行工具

测试 linux 压力的工具 一. 实际操作 1. 创建一个 ubuntu 的容器 docker run -it ubuntu 2. 安装 stress 工具 apt-get update && apt-get install -y stress 3. stress 命令 stress --vm [number]  标示创建几个进程 --vm-bytes [number]  为每一个进程分配多少字节的内存 默认256M内存    --verbose  循环分配 创建的进程 并释放 如果分配

nodejs 编写(添加时间戳)命令行工具 timestamp

Nodejs除了编写服务器端程序还可以编写命令行工具,如gulp.js就是Nodejs编写的. 接下来我们来实现一个添加时间戳的命令: $ timestamp action https://www.npmjs.com/package/timestamp007 1.需要用的模块: commander  模块 用途 :解析命令行参数 主页: https://tj.github.io/commander.js/ fs 模块 用途 :于对系统文件及目录进行读写操作 2.命令格式 编写命令行工具前,首先定

Node.js 命令行工具的编写

日常开发中,编写 Node.js 命令行工具来完成一些小任务是很常见的操作.其编写也不难,和日常编写 Node.js 代码并无二致. package.json 中的 bin 字段 一个 npm 模块,如果在 package.json 中指定了 bin 字段,那说明该模块提供了可在命令行执行的命令,这些命令就是在 bin 字段中指定的. package.json { "bin": { "myapp": "./cli.js" } } 程序安装后会可在

atitit.基于&#160;&#160;Commons&#160;CLI&#160;的命令行原理与&#160;开发

atitit.基于  Commons CLI 的命令行原理与 开发 1. 命令行支持的格式有以下几种:1 2. json化,map化的命令行参数内部表示1 3. Ati cli2 4. CLI库支持不同格式的选项: 2 5. 参考3 1. 命令行支持的格式有以下几种: 基于 Apache Commons CLI 的命令行开发 Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的

用 Swift 编写的工程代码静态分析命令行工具 smck

最近几周在用 swift 做一个命令行工具 smck 用来对现有 OC 工程的代码做些分析和处理.日后工程切换成 Swift 可以加上对 Swift 工程代码的支持.昨天看到喵神在微博上说他下周要直播 live coding 一个 swift 的命令行工具,传送门: 现场编程 - 用 Swift 创建命令行工具 fengniao-cli Part1 ,其实蛮期待.想想跟喵神挺有缘的,最近下了他开发的 iOS 应用 Mail Me,随时能够记录工作和准备讲座时一些灵感,smck 的一些实现还有模块

基于windows平台的命令行软件安装工具Chocolatey的安装

本文介绍Chocolatey的安装和使用 Chocolatey 这是基于.NET Framework 4以上的windows安装软件的命令行工具 安装 第一步,打开你的powershell.exe,使用管理员方式运行 第二步,运行命令 Get-ExecutionPolicy 如果返回 Restricted ,那么运行Set-ExecutionPolicy AllSigned 或者 Set-ExecutionPolicy Bypass -Scope Process 第三步,运行命令 Set-Exe

基于JDK命令行工具的监控

JVM的参数类型 JVM参数类型大体分为三种: 标准参数,基本每个版本的JVM都有的参数,比较稳定不变 X参数,非标准化的参数,每个JVM版本的都有些不一样,但是变化较小 XX参数,非标准化的参数,相对不稳定,每个JVM版本的变化都比较大,主要用于JVM调优和Debug 常见的标准参数: -help -server -client -version -showversion -cp -classpath 常见的X参数: -Xint : 解释执行 -Xcomp : 第一次使用就编译成本地代码 -X

[Kails] 一个基于 Koa2 构建的类似于 Rails 的 nodejs 开源项目

最近研究了下Koa2框架,喜爱其中间件的思想.但是发现实在是太简洁了,只有基本功能,虽然可以方便搭各种服务,但是离可以适应快速开发的网站框架还是有点距离.于是参考Rails的大致框架搭建了个网站框架kails, 配合postgres和redis, 实现了MVC架构,前端webpack,react前后端同构等网站开发基本框架.本文主要介绍kails搭建中的各种技术栈和思想. 本文首发于Blog of Embbnux, 转载请注明原文出处: https://www.embbnux.com/2016/

5个基于Linux命令行的文件下载和网站浏览工具

导读 命令行是GNU/Linux中最神奇迷人的部分,它是非常强大的工具;命令行本身功能多样,多种内建或者第三方的命令行应用使得Linux变得更加健壮和强大.Linux Shell支持多种不同类型的网络应用,无论是BT下载软件,专用下载器或者互联网冲浪. 5个命令行互联网工具 这里我们介绍了5个很好的命令行互联网工具,它们非常有用,也很容易上手. 1. rTorrent rTorrent是基于文本,用C++编写,追求高性能的Torrent客户端.支持大部分标准的Linux发行版,包括FreeBSD