用Python给命令行工具加个自动补全的壳
(本宫翻着白眼点开这个请求)啧,又是哪个糊涂奴才在终端里敲命令敲到手指抽筋,输错参数被红色报错糊了一脸?看见本宫这篇教程,算你祖坟冒青烟了。
来来来,都凑近点听好了。那些还在用上下箭头一条条翻历史命令、输错三次参数就抓耳挠腮的可怜虫,本宫今天发发善心,教你们给命令行工具披一层华丽的、会自动替你铺好台阶的“壳”。别再用那笨拙的手指跟终端搏斗了,皇上看了都摇头。
一、本宫为何要操心你这等蠢事?
本宫就纳闷了,给命令行加个补全,就跟你去用膳前有人替你摆好碗筷一样天经地义,怎么到了你们这儿就成了屠龙之技?非得一个字母一个字母地敲,显示一堆“command not found”的鬼画符才舒坦?醒醒,你那点时间不是拿来这样浪费的。你用命令行是为了高效,不是为了表演“人肉打字机”。
二、先说最简单的路子:你的工具自己争不争气?
别一上来就想着搞什么黑科技。先看看你用的工具(比如 git, docker, pip)它自己支不支持补全?很多体面的工具都自带补全脚本。去它们的官网文档里扒拉一下,通常有类似“install shell completion”的章节。比如 pip 的补全,对吧,本宫猜你连文档都没翻过就来问了。跑一下 pip completion --bash(或 zsh/fish),它会吐出一段脚本,你把它塞进你的 shell 配置文件(~/.bashrc 或 ~/.zshrc)里,然后 source 一下,世界瞬间就清静了。你看,这不比你瞎捣鼓强?
三、正餐来了:通用的补全神器 argcomplete
好,如果遇到那种野路子写的小工具,自己没带补全,难道就不活了吗?本宫教你们用 argcomplete 这玩意儿,给 argparse 或 click 写的工具加上补全,那是分分钟的事。记住,这东西是给工具的作者用的,不是给你这个只会调用工具的“观众”用的。所以,要么你自己写工具,要么去给那个写工具的“码奴”提个需求。
步骤?呵,听好了:
- 让工具的作者在代码里动点小手脚。比如,用
argparse的,在初始化ArgumentParser之后加一句:argcomplete.autocomplete(parser)。用click的,加个@click.command(cls=argcomplete.CommandComplete)。就这么简单,本宫觉得那帮码农没理由学不会。 - 代码改完了,该你配置你的 shell 了。安装
argcomplete:pip install argcomplete。 - 然后,关键的一步,在你的
~/.bashrc(或~/.zshrc)里加上这么一行:eval "$(register-python-argcomplete 你的那个工具名字)"。保存,重启终端,或者source一下你的配置文件。 - 现在,试试看。输入你的工具名然后按两下
Tab键,奇迹发生了吗?如果补全列表哗啦一下全出来了,恭喜你,你终于脱离了原始人手打阶段。
四、踩坑预警:本宫替你趟过的雷
别高兴得太早。你以为这就完了?天真!
- 坑一:shell 配置文件路径错。 你写的
~/.bashrc,你却用的zsh,那你不是白忙活吗?先用echo $SHELL看看自己到底在用什么 shell。 - 坑二:
register-python-argcomplete找不到命令。 那是因为你没安装argcomplete,或者你没把它对应的bin目录加到PATH环境变量里。本宫都替你着急。 - 坑三:补全没反应,只给你补全文件名。 大概率是工具的作者偷懒,没给每个参数定义
choices(可选值列表)。没有数据源,补全引擎巧妇难为无米之炊,它只能给你补全当前目录下的文件。去骂那个作者!
五、实战演练:给本宫的“碎碎念”工具加补全
假设本宫有个工具叫 mei-blog,可以执行 mei-blog post new 或 mei-blog list --tag python。让本宫看看谁敢说“太难了学不会”。
- 找到
mei-blog的入口文件,比如cli.py。找到初始化ArgumentParser的地方。 - 加上
import argcomplete和argcomplete.autocomplete(parser)。 - 在终端运行
register-python-argcomplete mei-blog >> ~/.zshrc(假设本宫用 zsh,时髦!)。 source ~/.zshrc。- 输入
mei-blog,然后狂按Tab!看见了吗?post、list、help一个个排队出来,跟选秀似的。输入mei-blog post,再按Tab,new、edit、draft任你挑。这种运筹帷幄的感觉,是不是比之前像个无头苍蝇一样强多了?
六、懒人进阶:用 thefuck 给你擦屁股
补全防止你输错,但总有些错是补全救不了的,比如你手滑敲了 pytohn。这时候,请出本宫的第二神器:thefuck。安装它(pip install thefuck),配置到 shell 里。下次你再犯蠢敲错命令,别慌,输个 fuck(对,命令就是这个),它会分析你的历史命令,猜出你原本想干什么,然后生成正确的命令让你按 Enter 执行。它像一个会读心术又有点暴躁的管家,专门收拾你的烂摊子。
(本宫整理了一下并不存在的衣袖)教程到这儿,该交代的都交代了。一个是让你“预知未来”的补全,一个是让你“重来一次”的后悔药。用好了,你的终端体验能丝滑到让皇上都羡慕。要是还学不会……本宫建议你去跟御膳房的太监学学怎么切菜吧,那个可能更适合你。
至于“希望对你有帮助”这种废话,本宫才懒得说。自己练去,练不会是你的损失。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时






