3 个 Python 命令行工具 | Linux 中国

2018 年 7 月 5 日 Linux中国
用 Click、Docopt 和 Fire 库写你自己的命令行应用。
-- Jeff Triplett, Lacey Williams Hensche



致谢
编译自 | 
https://opensource.com/article/18/5/3-python-command-line-tools
 
 作者 | Jeff Triplett, Lacey Williams Hensche
 译者 | jdong (hoppipolla-) 🌟 共计翻译:1 篇 贡献时间:1 天

用 Click、Docopt 和 Fire 库写你自己的命令行应用。

有时对于某项工作来说一个命令行工具就足以胜任。命令行工具是一种从你的 shell 或者终端之类的地方交互或运行的程序。Git[1] 和 Curl[2] 就是两个你也许已经很熟悉的命令行工具。

当你有一小段代码需要在一行中执行多次或者经常性地被执行,命令行工具就会很有用。Django 开发者执行 ./manage.py runserver 命令来启动他们的网络服务器;Docker 开发者执行 docker-compose up 来启动他们的容器。你想要写一个命令行工具的原因可能和你一开始想写代码的原因有很大不同。

对于这个月的 Python 专栏,我们有 3 个库想介绍给希望为自己编写命令行工具的 Python 使用者。

Click

Click[3] 是我们最爱的用来开发命令行工具的 Python 包。其:

◈ 有一个富含例子的出色文档
◈ 包含说明如何将命令行工具打包成一个更加易于执行的 Python 应用程序
◈ 自动生成实用的帮助文本
◈ 使你能够叠加使用可选和必要参数,甚至是  多个命令 [4]
◈ 有一个 Django 版本(  django-click [5] )用来编写管理命令

Click 使用 @click.command() 去声明一个函数作为命令,同时可以指定必要和可选参数。

   
   
     
  1. # hello.py

  2. import click

  3. @click.command()

  4. @click.option('--name', default='', help='Your name')

  5. def say_hello(name):

  6.    click.echo("Hello {}!".format(name))

  7. if __name__ == '__main__':

  8.    say_hello()

@click.option() 修饰器声明了一个 可选参数[6] ,而 @click.argument() 修饰器声明了一个 必要参数[7]。你可以通过叠加修饰器来组合可选和必要参数。echo() 方法将结果打印到控制台。

   
   
     
  1. $ python hello.py --name='Lacey'

  2. Hello Lacey!

Docopt

Docopt[8] 是一个命令行工具的解析器,类似于命令行工具的 Markdown。如果你喜欢流畅地编写应用文档,在本文推荐的库中 Docopt 有着最好的格式化帮助文本。它不是我们最爱的命令行工具开发包的原因是它的文档犹如把人扔进深渊,使你开始使用时会有一些小困难。然而,它仍是一个轻量级的、广受欢迎的库,特别是当一个漂亮的说明文档对你来说很重要的时候。

Docopt 对于如何格式化文章开头的 docstring 是很特别的。在工具名称后面的 docsring 中,顶部元素必须是 Usage: 并且需要列出你希望命令被调用的方式(比如:自身调用,使用参数等等)。Usage: 需要包含 help 和 version 参数。

docstring 中的第二个元素是 Options:,对于在 Usages: 中提及的可选项和参数,它应当提供更多的信息。你的 docstring 的内容变成了你帮助文本的内容。

   
   
     
  1. """HELLO CLI

  2. Usage:

  3.    hello.py

  4.    hello.py <name>

  5.    hello.py -h|--help

  6.    hello.py -v|--version

  7. Options:

  8.    <name>  Optional name argument.

  9.    -h --help  Show this screen.

  10.    -v --version  Show version.

  11. """

  12. from docopt import docopt

  13. def say_hello(name):

  14.    return("Hello {}!".format(name))

  15. if __name__ == '__main__':

  16.    arguments = docopt(__doc__, version='DEMO 1.0')

  17.    if arguments['<name>']:

  18.        print(say_hello(arguments['<name>']))

  19.    else:

  20.        print(arguments)

在最基本的层面,Docopt 被设计用来返回你的参数键值对。如果我不指定上述的 name 调用上面的命令,我会得到一个字典的返回值:

   
   
     
  1. $ python hello.py

  2. {'--help': False,

  3.  '--version': False,

  4.  '<name>': None}

这里可看到我没有输入 help 和 version 标记并且 name 参数是 None

但是如果我带着一个 name 参数调用,say_hello 函数就会执行了。

   
   
     
  1. $ python hello.py Jeff

  2. Hello Jeff!

Docopt 允许同时指定必要和可选参数,且各自有着不同的语法约定。必要参数需要在 ALLCAPS和 <carets> 中展示,而可选参数需要单双横杠显示,就像 --like。更多内容可以阅读 Docopt 有关 patterns[9] 的文档。

Fire

Fire[10] 是谷歌的一个命令行工具开发库。尤其令人喜欢的是当你的命令需要更多复杂参数或者处理 Python 对象时,它会聪明地尝试解析你的参数类型。

Fire 的 文档[11] 包括了海量的样例,但是我希望这些文档能被更好地组织。Fire 能够处理 同一个文件中的多条命令[12]、使用 对象[13] 的方法作为命令和 分组[14] 命令。

它的弱点在于输出到控制台的文档。命令行中的 docstring 不会出现在帮助文本中,并且帮助文本也不一定标识出参数。

   
   
     
  1. import fire

  2. def say_hello(name=''):

  3.    return 'Hello {}!'.format(name)

  4. if __name__ == '__main__':

  5.    fire.Fire()

参数是必要还是可选取决于你是否在函数或者方法定义中为其指定了一个默认值。要调用命令,你必须指定文件名和函数名,比较类似 Click 的语法:

   
   
     
  1. $ python hello.py say_hello Rikki

  2. Hello Rikki!

你还可以像标记一样传参,比如 --name=Rikki

额外赠送:打包!

Click 包含了使用 setuptools 打包[15] 命令行工具的使用说明(强烈推荐按照说明操作)。

要打包我们第一个例子中的命令行工具,将以下内容加到你的 setup.py 文件里:

   
   
     
  1. from setuptools import setup

  2. setup(

  3.    name='hello',

  4.    version='0.1',

  5.    py_modules=['hello'],

  6.    install_requires=[

  7.        'Click',

  8.    ],

  9.    entry_points='''

  10.        [console_scripts]

  11.        hello=hello:say_hello

  12.    ''',

  13. )

任何你看见 hello 的地方,使用你自己的模块名称替换掉,但是要记得忽略 .py 后缀名。将 say_hello 替换成你的函数名称。

然后,执行 pip install --editable 来使你的命令在命令行中可用。

现在你可以调用你的命令,就像这样:

   
   
     
  1. $ hello --name='Jeff'

  2. Hello Jeff!

通过打包你的命令,你可以省掉在控制台键入 python hello.py --name='Jeff' 这种额外的步骤以减少键盘敲击。这些指令也很可能可在我们提到的其他库中使用。


via: https://opensource.com/article/18/5/3-python-command-line-tools

作者:Jeff Triplett[17]Lacey Williams Hensche[17] 选题:lujun9972 译者:hoppipolla- 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


登录查看更多
0

相关内容

Django 是用 Python 语言写的开源 Web 开发框架,它鼓励快速开发,并遵循 MVC 设计和 BSD 版权。Django 根据比利时的爵士音乐家 Django Reinhardt 命名。
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
266+阅读 · 2020年6月10日
专知会员服务
171+阅读 · 2020年6月4日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
225+阅读 · 2020年3月22日
Python 3.8.0来了!
数据派THU
5+阅读 · 2019年10月22日
34个最优秀好用的Python开源框架
专知
9+阅读 · 2019年3月1日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
Arxiv
92+阅读 · 2020年2月28日
Arxiv
15+阅读 · 2020年2月6日
A Comprehensive Survey on Transfer Learning
Arxiv
121+阅读 · 2019年11月7日
Object Detection in 20 Years: A Survey
Arxiv
48+阅读 · 2019年5月13日
Embedding Logical Queries on Knowledge Graphs
Arxiv
3+阅读 · 2019年2月19日
Arxiv
22+阅读 · 2018年8月30日
Arxiv
3+阅读 · 2018年3月22日
VIP会员
相关VIP内容
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
266+阅读 · 2020年6月10日
专知会员服务
171+阅读 · 2020年6月4日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
225+阅读 · 2020年3月22日
相关资讯
Python 3.8.0来了!
数据派THU
5+阅读 · 2019年10月22日
34个最优秀好用的Python开源框架
专知
9+阅读 · 2019年3月1日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
Top
微信扫码咨询专知VIP会员