原标题:手把手教你用Python设计一个简单的命令行界面

对 Python 程序来说,完备的命令行界面可以提升团队的工作效率,减少调用时可能碰到的困扰。今天,我们就来教大家如何设计功能完整的 Python 命令行界面。

对 Python 开发者来说用的最多的界面恐怕还是命令行。就拿我参与的机器学习项目来说,训练模型和评估算法的精确度都是通过在命令行界面运行脚本来完成的。

所以调用一个 Python 脚本的时候我们希望这段脚本有一个尽量简洁方便调用的接口。尤其是团队中有多名开发者的时候这一点对提升团队的工作效率很重要。

要让一段脚本方便调用总的来说有四个原则需要遵守:

提供默认参数值

处理调用出错的情况,比如缺少参数、参数类型错误或者找不到文件等

在文档中说明各个参数和选项的用法

如果执行时间较长应该提供进度条

一个简单的例子

下面我们先通过一个简单的例子来谈谈这四个原则的具体应用。例子中给出的脚本的功能是使用凯撒码变换对文本进行加密和解密。

Caesar cipher:一种简单的消息编码方式。在密码学中,凯撒密码,移位密码是最简单和最广为人知的加密技术之一。

比如说我们想让用户通过命令行参数来选择调用的方式是加密还是解密文本,而且用户要从命令行传入下面 encrypt 函数中的密匙参数 key。

首先我们得在程序中拿到命令行参数。我在网上搜“ python 命令行参数”出来的第一个结果说让我用 sys.argv ,那我们就来试试看它好不好用。

初级:笨办法

其实 sys.argv 只是一个 list ,这个 list 的内容是用户调用脚本时所输入的所有参数(其中也包括脚本的文件名)。

如果我像下面这样调用加解密的脚本 caesar_.py 的话:

> python caesar_.py --key 23 --decrypt my secret message

pb vhfuhw phvvdjh

sys.argv 这个 list 的值就是:

['caesar_.py', '--key', '23', '--decrypt', 'my', 'secret', 'message']

所以我们现在要遍历这个 list 来找其中是否包括了“ –key ”或者“ -k ”,这样我们就能找到密匙“ 23 ”。再找到“ –decrypt ”就能知道用户是想要解密一段文本了(其实解密就是用密匙的相反数再加密一次)。

完成后的代码如下:

这段代码基本上遵守了我们提到的四个原则:

key 和 加密模式都设置了缺省参数

脚本可以处理像没有文本或者缺少参数这样比较基本的错误

用户没有给参数或者有错的话会显示使用帮助

> python caesar__using_sys_argv.py

Usage: python caesar.py [ --key ] [ --encrypt|decrypt ]

然而不算加密函数光处理参数我们就已经写了 39 行而且写得一点也不优雅。我有胆说肯定还有更好的办法来读命令行参数。

中级:argparse

Python 标准库里面提供了一个读取命令行参数的库——argparse 。我们来看看如果用 argparse 代码怎么写:

这样写也符合四项指导原则,而且对参数的说明和错误处理都优于使用 sys.argv 的笨办法:

不过我个人还是觉得代码里第 7 行到第 13 行定义参数的部分写得很啰嗦,而且我觉得参数应该使用声明式的方法来定义。

高级: click

还有一个叫 click 的库能实现我们想要的这些。它的基本功能和 argparse 是一样的,但写出来的代码更优雅。

使用 click 改写我们的加解密脚本之后是这样的:

我们需要的参数和选项都用装饰器来声明,这样就可以在 caesar 函数里直接使用了。

上面的代码里有几点需要说明:

nargs 参数是说这个参数的长度是几个词。默认值是 1 不过用引号引起来的句子也只算一个词。这里我们设为 -1 是指不限制长度。

--decrypt/--encrypt 这样加一个斜杠的写法用来指明互斥的选项,它的功能和 argparse 中的 add_mutually_exclusive_group 函数类似。

click.echo 是 click 提供的一个 print 功能,与 Python 2 和 3 都兼容,而且有颜色高亮功能。

添加隐私功能

我们写的是一个对文本加解密的脚本,但用户却直接把要加密的文本打出来了,这样有别人用这个命令行的话按几下上方向键就能看到我们的用户加密了什么东西,这是在是有点荒唐。

我们可以选择把用户要加密的文本隐藏起来,或者是从文件里读文本。这两种方法都能解决我们的问题,但选择权应该留给用户。

同理对于加解密的结果我们也让用户选择是直接在命令行输出还是保存成一个文件:

这里我给每个参数和选项都加上了一小段说明,这样我们的文档能更清楚一点因为我们现在参数有点多了。现在的文档是这样的:

两个新的参数 input_file 和 output_file 都是 click.File 类型,而且 click 帮我们处理了文件打开的读写方式和可能出现的错误,比如这样:

如果用户没有提供 input_file 的话,如说明文档中所写,则会让用户在命令行进行输入,而且用户输入不再是明文了:

破译密码

假设我们现在是黑客,想解密但是不知道密匙该怎么办呢?对凯撒加密的英文来说很容易,只要调用解密函数 25 次然后看看那个结果不是乱码就行了。

要调用 25 次还要一个一个看还是太麻烦,其实只要数数哪个结果里正确的英文词最多就行了。下面我们就用 PyEnchant 来实现自动破译密码:

一气呵成!

不过我们好像还没有提到四项原则的最后一点:

4.如果执行时间较长应该提供进度条

上面的脚本破译 104 个词的文本大约需要 5 秒。考虑到要遍历 25 个密匙还要数英文词的个数这个时间并不算慢。

不过文本再长的话,比如 105 个词的文本,就要花 50 秒。这就有点长了,用户可能没有耐心等到程序运行完就强退了。

所以我建议如果执行时间长的话最好加上进度条,关键是写起来非常简单:

不仔细看的话可能都看不出有什么区别,因为区别只有四个字母 tqdm ,阿拉伯语中 tqdm 是进度的意思。

tqdm 库的用法非常简单,只要把代码中的迭代器用 tqdm 括起来就行了:

for key in tqdm(range(26)):

这样就会在命令行输出一个进度条,简单得让人不敢相信。

其实 click 的 click.progress_bar 也有类似的功能,但我觉得 click 的进度条不好看而且写法比tqdm 稍微麻烦一点。

总结一下希望大家读完这篇文章能把设计 Python 命令行的这几个原则用到实践中去写出更好用的 Python 命令行。返回搜狐,查看更多

责任编辑:

python界面设计-手把手教你用Python设计一个简单的命令行界面相关推荐

  1. Python安装教程-手把手教你安装python

    python介绍和安装步骤 1. Python简介 Python是一种广泛使用的解释型.高级和通用的编程语言.Python支持多种编程范型,包括函数式.指令式.结构化.面向对象和反射式编程.它拥有动态 ...

  2. python拿什么做可视化界面好-手把手教你用Python做个可视化的“剪刀石头布”小游戏...

    /1 前言/ 最近在学习PyQt5可视化界面,这是一个内容非常丰富的gui库,相对于tkinter库,功能更加强大,界面更加美观,操作也不难.于是我开始小试牛刀,用PyQt5做个可视化的"剪 ...

  3. 怎么退出python虚拟环境_手把手教你进行Python虚拟环境配置

    /1 前言/ 咱们今天就来说一下Python的虚拟环境,可能有的小伙伴会疑惑,Python的虚拟环境有什么用呢?接下来我们一起来探讨一下. /2 虚拟环境的作用/ 咱们今天就来说一下Python的虚拟 ...

  4. python复工_手把手教你使用Python批量创建复工证明-阿里云开发者社区

    /1 前言/ 受疫情影响,2020年2月份.3月份企业复工需为员工开具复工证明.因本公司人数较多,复制粘贴工作量巨大,特此为行政同事写此小工具,现与诸位共享. /2 目标/ 1.实现批量将 Excel ...

  5. qq 音乐 python 登录_手把手教你使用Python抓取QQ音乐数据(第一弹)

    [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. [二.需要的库] 主要涉及的库有:requests.json ...

  6. python朗读网页-手把手教你用 Python 来朗读网页

    是不是有的时候懒得自己看新闻?那么不妨试试用 Python 来朗读给你听吧. 网页转换成语音,步骤无外乎: 网页正文识别,获取到正文的文本内容: 文本转语音,通过接口将文本转换成语音文件: 语音文件的 ...

  7. python图像分类_手把手教你用Python构建你的第一个多标签图像分类模型(附案例)...

    介绍 你正在处理图像数据吗?我们可以使用计算机视觉算法来做很多事情:对象检测 图像分割 图像翻译 对象跟踪(实时),还有更多-- 这让我思考--如果一个图像中有多个对象类别,我们该怎么办?制作一个图像 ...

  8. python国际象棋ai程序_手把手教你用 JavaScript 实现一个简单的国际象棋 AI

    转载请注明出处,保留原文链接以及作者信息 首先让我们先看几个对开发简单国际象棋 AI 很有帮助的概念: 移动生成 局面评估 极大极小算法 α-β 剪枝 每一步中我们都会对经过时间检验的国际象棋程序进行 ...

  9. vue代码生成器可视化界面_手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)...

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...

最新文章

  1. python批量改名_Python写个批量改名工具
  2. python课件_讲座直播 | Python在线课堂第二周
  3. AI:2020年6月23日北京智源大会演讲分享之智能信息检索与挖掘专题论坛——09:10-09:55裴健教授《智能搜索:从工具到思维方式和心智》
  4. 【CodeForces - 705C】Thor(模拟,STLset优化链表)
  5. 怎么查看ingress的规则_有机合成中常见的基础理论规则
  6. 2018最火机器学习项目盘点—CV项目领冠榜单
  7. Django 的 之 视图
  8. Oracle存储过程异常
  9. idea 导入spring 源码 踩坑记总结整理
  10. PowerPC 汇编
  11. PSCAD中的频变参数线路模型(Frequency-Dependent (Phase) Line Model)
  12. 自定义dns服务器是什么,dns服务器有什么用(电脑设置DNS的方法)
  13. python 聚类 客户细分_KMeans聚类:商城客户细分数据
  14. 5.4QBXT 模拟赛 (Rank1 机械键盘 蛤蛤)
  15. java实现Stripe信用卡支付
  16. Python 1-10 字符串操作
  17. window.requestAnimationFrame Web3D渲染帧率控制
  18. 小程序中消息订阅与发布
  19. oracle停监听服务,ORACLE监听服务启动后又停止了的解决
  20. Windows两种获取毫秒时间戳的方法

热门文章

  1. 线头尾两端各插入块lisp_如何在一条线段两端插入带角度得块?
  2. 开发日记-20190731 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 17
  3. Deep Belief Network简介——本质上是在做逐层无监督学习,每次学习一层网络结构再逐步加深网络...
  4. python spark kmeans demo
  5. go语言笔记——append底层实现和Cpp vector无异,只是有返回值,double后返回了新的vector地址而已...
  6. python-GUI,生成ssn
  7. WebApp NativeApp HybirdApp
  8. 关于BitmapImage EndInit()时报值不在范围内的异常
  9. linux下如何使用USB转串口设备
  10. HDOJ1035 ( Robot Motion ) 【递归】