Python 实战:构建命令行任务收藏助手(支持模糊搜索与一键执行)

引言
开发者、运维工程师、自动化脚本用户,几乎每天都要在终端执行各种命令,例如:

git pull origin main

docker restart my_container

python backup.py –full

ffmpeg -i input.mp4 -vf “scale=1280:720” output.mp4

你是否也曾希望:

“我能把这些常用命令收藏起来,随时用关键词查找,并一键执行。”

本文将带你构建一个 Python 命令行任务收藏助手,支持模糊搜索、分类管理与自动执行。它是一种轻量、工程化、高效率的 CLI 工具,真正做到提升效率、避免重复敲命令。

一、项目亮点与应用场景
1.1 项目亮点
本地收藏命令任务,带备注与分类

支持关键词模糊搜索,快速查找命令

使用命令编号执行任务,一键触发

支持 JSON 存储、命令追加与删除

可打包为单文件 CLI 工具部署

1.2 适用对象
经常使用终端工具的开发者、测试人员

需要执行脚本命令的运维工程师

个人效率提升爱好者

二、项目结构设计
bash
复制
编辑
cli_task_helper/
├── main.py # 命令入口
├── tasks.json # 命令存储库(自动创建)
├── task_manager.py # 管理任务逻辑
├── search_utils.py # 模糊搜索模块
└── utils.py # 公共函数
三、命令存储模型(tasks.json)
json
复制
编辑
[
{
“name”: “重启容器”,
“cmd”: “docker restart my_container”,
“tags”: [“docker”, “restart”]
},
{
“name”: “项目拉取”,
“cmd”: “git pull origin main”,
“tags”: [“git”, “pull”]
}
]
每个任务包含:

name:任务名称(中文或自定义)

cmd:实际执行命令

tags:关键词集合(用于搜索)

四、任务管理模块 task_manager.py
python
复制
编辑
import json
import os

TASK_FILE = “tasks.json”

def load_tasks():
if not os.path.exists(TASK_FILE):
return []
with open(TASK_FILE, “r”, encoding=”utf-8”) as f:
return json.load(f)

def save_tasks(tasks):
with open(TASK_FILE, “w”, encoding=”utf-8”) as f:
json.dump(tasks, f, indent=2, ensure_ascii=False)

def add_task(name, cmd, tags):
tasks = load_tasks()
tasks.append({“name”: name, “cmd”: cmd, “tags”: tags})
save_tasks(tasks)

def delete_task(index):
tasks = load_tasks()
if 0 <= index < len(tasks):
tasks.pop(index)
save_tasks(tasks)
return True
return False
五、模糊搜索模块 search_utils.py
python
复制
编辑
def fuzzy_search(tasks, keyword):
result = []
for idx, task in enumerate(tasks):
content = task[“name”] + “ “ + “ “.join(task[“tags”])
if keyword.lower() in content.lower():
result.append((idx, task))
return result
支持简单的子串模糊匹配,适合 CLI 快速搜索。

六、终端工具主程序 main.py
python
复制
编辑
import sys
import subprocess
from task_manager import load_tasks, add_task, delete_task
from search_utils import fuzzy_search

def print_usage():
print(“””
命令任务助手
用法:
python main.py add # 添加新任务
python main.py list # 显示所有任务
python main.py search 关键词
python main.py run 编号 # 执行指定任务
python main.py del 编号 # 删除指定任务
“””)

def add_interactive():
name = input(“任务名称:”)
cmd = input(“命令内容:”)
tags = input(“标签(空格分隔):”).split()
add_task(name, cmd, tags)
print(“✅ 已添加任务:”, name)

def list_tasks():
tasks = load_tasks()
for idx, t in enumerate(tasks):
print(f”[{idx}] {t[‘name’]}\n ▶ {t[‘cmd’]} 标签: {‘, ‘.join(t[‘tags’])}”)

def search(keyword):
tasks = load_tasks()
results = fuzzy_search(tasks, keyword)
if not results:
print(“❌ 未找到匹配任务”)
for idx, task in results:
print(f”[{idx}] {task[‘name’]} ▶ {task[‘cmd’]}”)

def run(index):
tasks = load_tasks()
try:
task = tasks[int(index)]
print(f”⚙️ 执行:{task[‘cmd’]}”)
subprocess.run(task[“cmd”], shell=True)
except:
print(“❌ 执行失败,编号无效”)

def delete(index):
if delete_task(int(index)):
print(“✅ 删除成功”)
else:
print(“❌ 编号无效”)

if name == “main“:
if len(sys.argv) < 2:
print_usage()
else:
action = sys.argv[1]
if action == “add”:
add_interactive()
elif action == “list”:
list_tasks()
elif action == “search” and len(sys.argv) == 3:
search(sys.argv[2])
elif action == “run” and len(sys.argv) == 3:
run(sys.argv[2])
elif action == “del” and len(sys.argv) == 3:
delete(sys.argv[2])
else:
print_usage()
七、使用演示
7.1 添加任务
bash
复制
编辑
$ python main.py add
任务名称:重启Nginx
命令内容:sudo systemctl restart nginx
标签(空格分隔):nginx restart
7.2 搜索任务
bash
复制
编辑
$ python main.py search restart
[0] 重启Nginx ▶ sudo systemctl restart nginx
[1] 重启容器 ▶ docker restart my_container
7.3 执行任务
bash
复制
编辑
$ python main.py run 0
⚙️ 执行:sudo systemctl restart nginx
7.4 删除任务
bash
复制
编辑
$ python main.py del 0
✅ 删除成功
八、打包为 CLI 工具(可选)
使用 pyinstaller 将工具打包为单文件 CLI:

bash
复制
编辑
pip install pyinstaller
pyinstaller –onefile main.py
打包完成后生成 dist/main 可执行文件,可在任意终端使用。

九、进阶优化建议
本项目结构简洁清晰,可以继续扩展以下方向:

使用 sqlite3 替代 JSON 存储,支持任务标签索引

支持“组合任务”功能(多个命令一步执行)

加入命令执行结果记录(成功/失败/输出)

自动备份任务数据(如每日导出为 JSON)

语音播报提示执行完成(使用 pyttsx3)

十、总结
通过本项目,我们构建了一个实用的 CLI 工具,具有以下优势:

工程化组织,便于长期维护

支持收藏、模糊搜索与快捷执行命令

非常适合用于个人命令管理、运维日常操作、开发脚本调度等

这是一个小巧而强大的工具,也适合作为 Python CLI 工具开发的入门项目模板。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!