11、打造自己的 CLI 工具:从命令行到桌面效率神器

🖥 会写函数很正常,但会写"命令行工具"的人,已经开始走向工程化之路了。 这篇带你用 Python 构建一个 git 一样能直接在命令行运行的实用小工具


✅ 本文目标

  • 理解什么是 CLI 工具(Command Line Interface)
  • 使用标准库 argparse 解析命令行参数
  • 构建一个待办事项命令行工具:todo
  • 打包成命令行程序:一条命令搞定!

📦 一、为什么需要 CLI 工具?

举个例子:

bash 复制代码
git status
pip install numpy
python manage.py runserver

这些都是 CLI 工具,你也可以做自己的:

bash 复制代码
todo add "写周报"
todo list
todo done 2

🛠 二、使用 argparse 构建 CLI 工具框架

👇 结构:

python 复制代码
import argparse

parser = argparse.ArgumentParser(description="我的命令行工具")

parser.add_argument("command", help="要执行的命令")
parser.add_argument("args", nargs="*", help="参数列表")

args = parser.parse_args()

print("你输入的命令是:", args.command)
print("参数是:", args.args)

运行:


✅ 三、实战:todo 待办事项命令行工具

📝 功能定义:

  • todo add "任务名" → 添加任务
  • todo list → 查看当前任务
  • todo done 2 → 标记第 2 个任务为完成

🗃 使用 JSON 文件保存任务数据


第一步:定义数据结构

python 复制代码
import json, os

FILE = "tasks.json"

def load_tasks():
    if not os.path.exists(FILE):
        return []
    with open(FILE, "r") as f:
        return json.load(f)

def save_tasks(tasks):
    with open(FILE, "w") as f:
        json.dump(tasks, f, indent=2)

第二步:实现功能函数

python 复制代码
def add_task(name):
    tasks = load_tasks()
    tasks.append({"name": name, "done": False})
    save_tasks(tasks)
    print(f"✅ 添加任务:{name}")

def list_tasks():
    tasks = load_tasks()
    for i, t in enumerate(tasks, 1):
        status = "✅" if t["done"] else "❌"
        print(f"{i}. {status} {t['name']}")

def mark_done(index):
    tasks = load_tasks()
    if 0 <= index - 1 < len(tasks):
        tasks[index - 1]["done"] = True
        save_tasks(tasks)
        print(f"🎉 已完成任务:{tasks[index - 1]['name']}")
    else:
        print("❌ 无效任务编号")

第三步:组合命令行入口

python 复制代码
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("cmd", help="命令:add/list/done")
parser.add_argument("arg", nargs="?", help="参数")
args = parser.parse_args()

if args.cmd == "add":
    add_task(args.arg)
elif args.cmd == "list":
    list_tasks()
elif args.cmd == "done":
    mark_done(int(args.arg))
else:
    print("未知命令")

🧪 运行


🧳 四、升级玩法

1. 打包为命令行脚本(支持 todo 直接调用)

在根目录添加 setup.py

python 复制代码
from setuptools import setup

setup(
    name='todo-cli',
    version='0.1',
    py_modules=['todo'],
    entry_points={
        'console_scripts': [
            'todo=todo:main',
        ],
    },
)

然后执行:

bash 复制代码
pip install -e .

你就可以直接运行:

todo.py

python 复制代码
# todo.py
import argparse
import json
import os

FILE = "tasks.json"

def load_tasks():
    if not os.path.exists(FILE):
        return []
    with open(FILE, "r") as f:
        return json.load(f)

def save_tasks(tasks):
    with open(FILE, "w") as f:
        json.dump(tasks, f, indent=2)

def add_task(name):
    tasks = load_tasks()
    tasks.append({"name": name, "done": False})
    save_tasks(tasks)
    print(f"✅ 添加任务:{name}")

def list_tasks():
    tasks = load_tasks()
    for i, t in enumerate(tasks, 1):
        status = "✅" if t["done"] else "❌"
        print(f"{i}. {status} {t['name']}")

def mark_done(index):
    tasks = load_tasks()
    if 0 <= index - 1 < len(tasks):
        tasks[index - 1]["done"] = True
        save_tasks(tasks)
        print(f"🎉 已完成任务:{tasks[index - 1]['name']}")
    else:
        print("❌ 无效任务编号")

# ✅ 添加 main 函数作为入口
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("cmd", help="命令:add/list/done")
    parser.add_argument("arg", nargs="?", help="参数")
    args = parser.parse_args()

    if args.cmd == "add":
        add_task(args.arg)
    elif args.cmd == "list":
        list_tasks()
    elif args.cmd == "done":
        mark_done(int(args.arg))
    else:
        print("未知命令")

💡 拓展挑战

  • 添加优先级字段
  • 支持任务删除
  • 每天清空完成任务(加时间戳)
  • 做一个带图标的桌面版本(用 PyQt5 / tkinter)

🧠 总结一句话

写函数是程序员技能 ,写 CLI 工具是开发者能力 ,而能把 CLI 工具打包发布的是工程师水平

相关推荐
神奇的程序员4 小时前
从已损坏的备份中拯救数据
运维·后端·前端工程化
哥本哈士奇(aspnetx)5 小时前
Streamlit + LangChain 1.0 简单实现智能问答前后端
python·大模型
oden5 小时前
AI服务商切换太麻烦?一个AI Gateway搞定监控、缓存和故障转移(成本降40%)
后端·openai·api
我一定会有钱5 小时前
斐波纳契数列、end关键字
python
李慕婉学姐6 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
小鸡吃米…6 小时前
Python 列表
开发语言·python
m0_740043736 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
星依网络7 小时前
yolov5实现游戏图像识别与后续辅助功能
python·开源·游戏程序·骨骼绑定
招风的黑耳7 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
大佐不会说日语~7 小时前
Spring AI Alibaba 的 ChatClient 工具注册与 Function Calling 实践
人工智能·spring boot·python·spring·封装·spring ai