学过Python都知道或者听过Fabric,它是Python的三大神器之一:自动化发布工具。而invoke就是Fabric最核心的基础组件。也是我们今天要介绍的主角,作为一个命令行工具,invoke专注于“任务执行”,通过CLI和shell命令来执行任务。

invoke的安装及使用

首先执行安装命令:

pip install invoke

invoke的使用还是比较简单的,只需要注意以下几点:

  • 1、创建任务文件,例如创建一个task.py任务文;
  • 2、@task 装饰器,定义函数时添加@task装饰器,即标记该函数为一个任务;
  • 3、上下文参数,给装饰的函数添加一个上下文参数;
  • 4、命令行执行,执行任务使用invoke xxx来执行,xxx代表任务名,并且命令中“invoke”可以简写为inv“”;

以下是一个简单的示例:

# 文件名:task.py
from invoke import task

@task
def hello(c):
print("Hello world!")

@task
def greet(c, name):
c.run(f"echo {name}加油!")

在上述代码的定义了两个任务,这里要注意的是@task装饰器可以不带参数,也能带参数,另外需要注意的是上下文参数(即上例的“c”)必须显示的指明,如果缺少这个参数,则会抛出异常。执行上述任务:

>>> inv hello
Hello world!
>>> inv greet 中国
中国加油!
>>> inv greet --name="中国"
中国加油!

更好地使用invoke

上面我们简单了解了invoke的使用方法,以及使用它所需要的几项要素,接下来我们看看如何更好地使用invoke为我们服务。

定义函数帮助信息

上面定义的任务函数中,我们只能简单的看到任务名,而对这个函数的作用一无所知,可读性极差,而这时候我们可以为我们的任务函数添加摘录信息:

@task(help={'name': 'A param for test'})
def greet(c, name):
"""
A test for shell command.
Second line.
"""
c.run(f"echo {name}加油!")

当我们执行查询任务列表命令时,就会展示当前任务的相关信息:

>>> inv -l
Available tasks:

greet A test for shell command.
>>> inv --help greet
Usage: inv[oke] [--core-opts] greet [--options] [other tasks here ...]

Docstring:
A test for shell command.
Second line.

Options:
-n STRING, --name=STRING A param for test

任务的拆分和组合

当任务过于复杂时,这时候我们需要将其拆分成一系列的小任务,反过来,我们也能将一系列的小任务组合成一个大任务。一般在拆分或组合任务时,有两种思路:

  • 1、对内分解,对外统一:只定义一个@task任务函数作为入口,而将处理逻辑抽象成多个方法。
  • 2、多点呈现,单点汇总:同时定义多个@task任务函数,将相关联的任务组合起来,此时在外部调用某个任务时,同时执行与它相关联的任务。

上述两种思路,第一种实现和使用都非常简单,但只适合执行单独的任务,灵活性低,而第二种则不同,既能执行单一任务也能多个任务组合执行。

@task
def clean(c):
c.run("echo clean")

@task
def message(c):
c.run("echo message")

@task(pre=[clean], post=[message])
def build(c):
c.run("echo build")

上述代码就是一个组合任务,@task装饰器的参数“pre”和“post”分别表示前置任务和后置任务。而我们可以看到“pre”和“post”的值都属于数组,表明可以同时设置多个任务,另外,在默认情况下,@task 装饰器的位置参数会被视为前置任务:

@task(clean, message)
def test(c):
c.run("echo test")

模块的拆分和整合

大型项目中,往往涉及多人开发,这时候我们有必要对task.py进行拆分和整合,invoke 提供了这方面的支持。首先在tasks.py文件中导入其他任务文件,然后使用invoke 的 Collection 类把它们关联起来。我们创建新的任务文件task1.py:

# 文件名:tasks.py
from invoke import Collection, task
import task1

@task
def deploy(c):
c.run("echo deploy")

namespace = Collection(task1, deploy)

每个文件拥有独立的命名空间,而Collection得作用是给整合的任务创建一个新的命名空间,以实现统一管理:

>>> inv -l
Available tasks:

deploy
task1.greet
task1.hello
>>> inv deploy
deploy
>>> inv task1.hello
Hello world!
>>> inv task1.greet 中国
中国加油!

交互式操作

在某些任务中可能存在需要交互的操作,这时invoke为我们提供了在程序运行期的监控能力,可以监听stdout 和stderr ,并支持在stdin 中输入必要的信息。例如执行某个任务时,提示:“Are you ready? [y/n]”,只有当输入“y”并且按下回车键才会继续执行。

只需要在代码中设置responses 参数的内容,当监听到匹配的信息时,程序就会自动执行相应操作:

responses = {r"Are you ready? \[y/n\] ": "y\n"}
ctx.run("excitable-program", responses=responses)

responses 是字典类型,键值对分别为监听内容及其回应内容。需注意,键值会被视为正则表达式,所以像本例中的方括号就要先转义。

命令工具库

Python存在许多好用的命令工具库,这里invoke也能作为一个命令工具库来使用,而实际上,Fabric将invoke分离成独立库时就是为了让它能承担解析命令行和执行子命令的任务。

假设我们要开发一个 tester 工具,让用户pip install tester 安装,而此工具提供两个执行命令:tester unit 和tester intergration 。

这两个子命令需要在 tasks.py 文件中定义:

# tasks.py
from invoke import task

@task
def unit(c):
print("Running unit tests!")

@task
def integration(c):
print("Running integration tests!")

然后在程序入口文件中引入它:

# main.py
from invoke import Collection, Program
from tester import tasks

program = Program(namespace=Collection.from_module(tasks), version='0.1.0')

最后在打包文件中声明入口函数:

# setup.py
setup(
name='tester',
version='0.1.0',
packages=['tester'],
install_requires=['invoke'],
entry_points={
'console_scripts': ['tester = tester.main:program.run']
}
)

如此打包发行的库,就是一个功能齐全的命令行工具了:

$ tester --version
Tester 0.1.0
$ tester --help
Usage: tester [--core-opts] <subcommand> [--subcommand-opts] ...

Core options:
... core options here, minus task-related ones ...

Subcommands:
unit
integration

$ tester --list
No idea what '--list' is!
$ tester unit
Running unit tests!

上手容易,开箱即用,invoke 不失为一款可以考虑的命令行工具库。

总结

invoke 作为从 Fabric 项目中分离出来的独立项目,它自身具备一些完整而强大的功能,除了可用于开发命令行工具,它还是著名的任务自动化工具。

invoke,十分钟搞定强大的Python任务自动化工具相关推荐

  1. JeecgBoot 单体升级微服务快速方案(十分钟搞定)

    JeecgBoot 单体升级微服务方案(十分钟搞定) 当前系统分为system.demo 等模块,现有需求把每个模块单独启动作为微服务应用,故而推出新版boot[20200812beta],支持快速切 ...

  2. 逗号后面统一加空格_十分钟搞定字幕,教你做加字幕的“快手菜”

    平台上许多同学有疑问:做视频是否有加字幕的必要呢? 其实除了外语需要翻译.语速过快加字幕方便理解.普通话不标准等情况之外,还是建议有余力的同学可以加上字幕,提升用户的观看体验. 那么问题来了,存在以下 ...

  3. 全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析

    全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析 废话先说一点,算了.直接进入正题吧. 用例子说话: JSON数据: string json: " {" ...

  4. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信提现功能开发的流程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 获取用户OPENI ...

  5. java 分组报表_【Java】分组报表怎么做,积木报表十分钟搞定!

    首页 专栏 java 文章详情 0 分组报表怎么做,积木报表十分钟搞定! scott发布于 今天 12:24 报表需求 某大型超市需要做一张年度区域销售统计报表 展示2019和2020年度各地区每月的 ...

  6. java零钱换整程序_JAVA微信企业付款到零钱(十分钟搞定),

    JAVA微信企业付款到零钱(十分钟搞定), 最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉 ...

  7. mfc远程连接mysql数据库连接_MFC连接mysql数据库(十分钟搞定)

    最近要做一个大作业,需要用到数据库,sql server装了两次都失败,遂弃暗投明,用mysql,虽然我从来没有接触过,数据库么,一通百通的,5分钟就熟悉了.问题的关键是要用MFC连接mysql数据库 ...

  8. 支付宝上线新功能:去这个国家入境十分钟搞定!

    11月15日,作为"新马泰"旅游胜地的泰国是出国旅游热度最高的几个国家之一.据统计,2018年中国游客赴泰旅游突破了1054万人,比2017年上升了7.4%.2018年赴泰旅游的中 ...

  9. poi实现excel上传下载 亲自实践 教你十分钟搞定

    今天要实现一个上传excel的功能,之前写过很多次,但是都没有详细整理过,今天整理下,方便以后直接拿来拷贝 首先从前台来看,看了很多案例,基本两种方法:一种是form表单提交,一种是异步ajax方式. ...

最新文章

  1. 无人驾驶急需解决:规划控制和传感器价格高两大问题(附Apollo算法)
  2. python使用字典格式化字符串-4.2.3Python下字典的格式化字符串
  3. Docker环境运行SpringBoot项目
  4. google浏览器插件 开发 获取页面指定数据_程序员必备的4款Chrome插件,编程神器...
  5. 判断android图片是否硬解码(方法)
  6. 集合使用与内部实现原理
  7. 95-20-010-协议-Kafka的Request和Response
  8. php漏洞黑掉数据库,WDCPnbsp;add_user.php任意数据库添加任意用户漏洞分析
  9. Vim安装使用和配置
  10. JAVA实现显示指定类型的文件的例子
  11. 统计在线人数访问人数
  12. 2019最新版Eclipse下载与安装
  13. win10安装wireshark经常报“KB2999226 和 KB3118401”补丁未安装的问题
  14. uint 数据类型理解
  15. c#实现禁用u盘再启用
  16. esxi01磁盘扩容_给EXSI虚拟机中linux硬盘扩容
  17. 百度BAE上能装什么pHp框架,百度Bae云平台安装dedecms图文教程
  18. Vertica的那些事
  19. PS生成动态的二维码
  20. 40岁左右适合干个什么样的小生意?

热门文章

  1. 开发者账号申请流程(公司的),APPID的申请,邓白氏编码的申请
  2. Flink事件时间、水印以及迟到数据处理的个人理解
  3. DXVA VDPAU FFDSHOW
  4. SQL重叠交叉区间问题分析--HiveSQL面试题30
  5. ccie 与 java,Java和ccie的区别
  6. vue中使用vue-infinite-scroll
  7. DM10分区图文教程
  8. 不用会编程,也能做软件,无代码技术是否真有这么神奇?
  9. 前端~html~HTML零基础(一) ~HTML常见标签/如何开发一个html文件/在网页查看源码
  10. python日历模块提示没有属性月_Python calendar日历模块的说明