🖥 会写函数很正常,但会写"命令行工具"的人,已经开始走向工程化之路了。 这篇带你用 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 .
你就可以直接运行:
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 工具打包发布的是工程师水平。