Python 任务自动化工具 tox 教程
哎我跟你说,我昨晚在工位那儿喝着那个已经凉透了的美式,正想关电脑回家,结果小李突然拍我一下,说“东哥你不是老用那个…呃…那个叫什么来着…哦 tox,对对 tox,你给我讲讲呗”。我当时脑子已经快罢工了,但还是随手敲了点东西给他看,他说看不懂,我说那算了我下班…你等下,让我把思路捡一下……
反正我边走去地铁边跟他念叨,那个…tox 其实就像你家里做饭那种一键清厨房模式,你把乱七八糟的锅碗瓢盆一关,一次性给你全部搞定。Python 项目里嘛,它就是负责帮你把各种环境、测试、格式校验那堆杂事全部自动整合,每次你敲 tox,它就自己帮你把一堆操作全跑了,你根本不用记指令,对吧,就是这种感觉……
我昨天给小李举了个小 demo,他当时还说我敲错了一个 tab,唉算了可能是我太困。你大概看一下这个配置:
# tox.ini
[tox]
envlist = py38, py39, lint
[testenv]
deps = pytest
commands = pytest -q
[testenv:lint]
deps = flake8
commands = flake8 src/
我那时候边说边找耳机,跟他说这个文件就是 tox 的“菜单”,你想让 tox 帮你做啥,你就往里面加,不然他啥都不干。他还问我为什么要写两个 Python 版本,我说你多测几遍嘛,省得线上炸给你老板打电话。
然后我突然想起我本地还有个老项目用 tox 做自动化打包,就顺便翻给他看,那会儿我正等电梯,信号还一卡一卡的,我跟他说 tox 跑环境的时候其实是给你开一个小隔间,里面 pip 装什么都不会污染你全局 Python,那种安心感你懂吧……他点头点得跟捣蒜一样。
我当时也顺嘴敲了点代码让他看看 tox 怎么跑脚本,比如你要自动执行某个 Python 文件,像是迁移脚本、生成报告那种,你就写:
[testenv:build]
deps =
requests
commands =
python scripts/generate_report.py
我记得他说“东哥那生成报告卡半天怎么办”,我说那你就别在 tox 里放太重的东西,或者你自己在脚本里加一下进度条,不关 tox 的事哈。
然后我还给他演示了一下怎么跑:
tox -e lint # 只跑 lint
tox # 跑所有环境
tox -e py39 -- -k login # 传额外参数给 pytest
结果他看半天说:“东哥这个 -- -k 是不是写错了?”我说没有,就是这样写的,不信你自己试,你要是写不出横杠你可以 copy 我这个。
不过你别说,tox 有一点我老觉得挺妙的,就是你可以把项目所有琐碎任务全部塞进去,连格式化代码、自动构建文档都能一起跑,我之前还玩过一个:
[testenv:fmt]
deps = black
commands = black src/
我那会儿还嘴里嘀咕说 black 老给我改代码风格,看着挺顺眼但有时候太严格,结果电梯门开了,我手机差点掉地上。
啊对,我差点忘了,小李当时还问我怎么让 tox 自动创建虚拟环境不要每次都重新装依赖,他说他那网速不行。我跟他说加这个:
[tox]
skipsdist = True
recreate = False
但我又说如果你依赖更新了还是要手动清一下,不然 tox 不知道你换东西了。他说懂了懂了,其实我感觉他没懂。
反正 tox 的逻辑大概就是“我替你做重复活儿”,你把要做的事情塞进去,它每次严格照着清单办事,不会像你晚上加班脑子转不动会点错命令。
哎我现在在等外卖,饿死了,想到哪说到哪,你要是想写个完整教程我回头给你补点图,不过 tox 这玩意吧,用两天你就知道怎么顺手了……算了我先吃饭,待会再说。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB