尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

用Python打造个人自动化成长管理系统:命令行工具实现任务、提醒与复盘

发布时间:2026/9/7 2:08:35

资讯中心
01
ARTICLE

用Python打造个人自动化成长管理系统:命令行工具实现任务、提醒与复盘

用Python打造个人自动化成长管理系统:命令行工具实现任务、提醒与复盘
平时大部分时间都在满足工作、领导、客户的需求等到晚上静下来才发现自己真正想做的事一件也没做。本文不是讲心灵鸡汤而是分享一套用 Python 搭建的个人自动化成长小系统把任务管理、时间记录、健康提醒、每日复盘统一到一个命令行工具里让技术真正为“取悦自己”服务。【个人成长自动化】用 Python 搭建一套“取悦自己”的生活管理系统1. 背景与核心概念1.1 为什么要为“自己”做一套系统很多人把效率工具等同于工作计划表列的全是“今天要交付什么”“本周要完成什么”唯独没有“今天我想读什么书”“最近我有没有好好休息”。当所有工具都在为外部目标服务时个人成长就会被挤压到角落。“你的生活只为取悦自己”这句话听起来很感性但它背后的工程化思路非常务实把自己当成一个长期维护的项目需要记录、反馈、复盘和持续优化。与其依赖各种分散的 App不如自己写一套轻量级工具数据完全掌握在自己手里。本文要实现的工具本质上是一个“个人成长记录与提醒系统”。它能帮你用简单的命令记录每日任务和想做的事自动区分重要、紧急任务生成每日复盘报告通过定时任务在固定时间提醒你休息、喝水、阅读把零散的行为记录变成可统计的数据。1.2 这个系统解决什么问题市面上的待办软件很多但通常有两个问题一是数据存在别人的服务器上隐私和长期可用性受限二是功能太复杂打开 App 的成本比执行任务还高。用 Python 写一套命令行版本优势非常明显启动快一条命令就能添加任务数据以 JSON 文件保存方便备份和迁移逻辑透明想加什么功能都能自己改可以配合系统定时任务实现自动化提醒没有广告没有社交分享纯粹为了自己。适合这类工具的读者包括想养成读书习惯的程序员、需要每日复盘的产品经理、讨厌花哨工具的学生以及希望把个人生活数据化的开发者。1.3 核心设计思路整体设计遵循“简单可扩展”原则。我们不做重型后台不引入数据库只用 Python 标准库完成数据读写、任务管理和报告生成。核心概念有三个任务模型一条任务包含标题、重要程度、紧急程度、完成状态、创建时间、完成时间。配置分离提醒时间、日志路径等写在独立的 JSON 配置文件里不硬编码到代码中。命令入口通过命令行子命令完成add、list、done、report、remind等操作。这套设计思路与后端项目中的模块化、配置化思想完全一致只是把场景从“业务系统”换成了“个人生活管理”。2. 环境准备与版本说明2.1 运行环境本文示例以 Python 3.8 为主操作系统可以是 Windows、macOS 或 Linux。为了保证示例可复现以下版本仅供参考实际操作中请根据自己环境调整Python 3.8 或更高版本操作系统Windows 10/11、Ubuntu 20.04、macOS 12命令行工具Windows 使用 CMD 或 PowerShellLinux/macOS 使用终端编辑器VS Code、PyCharm 或任何能编辑 Python 文件的编辑器可选工具Git用于版本管理。这里不依赖第三方库所以不需要requirements.txt中安装大量依赖。如果你希望输出更美观可以安装rich但核心功能不会用到它。2.2 项目目录结构为了使代码清晰我们采用一个简单的包结构life-keeper/ ├── config/ │ └── settings.json ├── data/ │ └── tasks.json ├── logs/ │ └── app.log ├── keeper/ │ ├── __init__.py │ ├── config.py │ ├── models.py │ └── main.py └── README.md目录说明config/settings.json存放提醒时间、日志路径、个人昵称等配置data/tasks.json自动生成的任务数据文件logs/app.log记录操作日志keeper/核心代码包main.py命令行入口后续都通过它执行操作。3. 核心模块设计与代码拆解3.1 配置模块把变化的内容从代码中抽离很多个人脚本写到最后难以维护原因是路径、时间、人名等全部散落在代码里。这里先用一个settings.json统一管理。配置文件示例{ nickname: 王悦, remind_interval_minutes: 30, work_start_time: 09:00, work_end_time: 18:00, lunch_remind_time: 12:00, log_file: logs/app.log, task_file: data/tasks.json }参数说明nickname用于报告和提醒文案中的称呼remind_interval_minutes多久提醒一次供外部定时任务参考work_start_time/work_end_time用于计算工作时间lunch_remind_time午饭提醒时间log_file日志文件路径task_file任务数据文件路径。在keeper/config.py中加载配置# keeper/config.py import json from pathlib import Path BASE_DIR Path(__file__).resolve().parent.parent CONFIG_FILE BASE_DIR / config / settings.json class Settings: def __init__(self, config_pathCONFIG_FILE): self.config_path Path(config_path) self.config self._load() def _load(self): if not self.config_path.exists(): raise FileNotFoundError(f配置文件不存在{self.config_path}) with open(self.config_path, r, encodingutf-8) as f: return json.load(f) def get(self, key, defaultNone): return self.config.get(key, default) property def nickname(self): return self.get(nickname, 朋友) property def log_file(self): return BASE_DIR / self.get(log_file, logs/app.log) property def task_file(self): return BASE_DIR / self.get(task_file, data/tasks.json) settings Settings()这样做的好处是换电脑、换姓名、调整提醒时间时只需要修改配置文件不需要动任何业务代码。3.2 任务模型使用 dataclass 定义数据结构Python 的dataclasses模块非常适合用来定义轻量级数据模型。相比字典它提供了类型提示和默认值代码更不容易出错。# keeper/models.py import json from dataclasses import dataclass, asdict, field from datetime import datetime from pathlib import Path dataclass class Task: title: str important: bool False urgent: bool False done: bool False created_at: str field(default_factorylambda: datetime.now().strftime(%Y-%m-%d %H:%M:%S)) finished_at: str def mark_done(self): self.done True self.finished_at datetime.now().strftime(%Y-%m-%d %H:%M:%S) property def priority(self): if self.important and self.urgent: return A-优先做 if self.important and not self.urgent: return B-计划做 if not self.important and self.urgent: return C-委托或快速做 return D-少做 def load_tasks(task_file): path Path(task_file) if not path.exists(): return [] with open(path, r, encodingutf-8) as f: data json.load(f) return [Task(**item) for item in data] def save_tasks(task_file, tasks): path Path(task_file) path.parent.mkdir(parentsTrue, exist_okTrue) data [asdict(task) for task in tasks] with open(path, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2)这里的关键点是priority属性它借鉴了时间管理中的四象限法。很多人的任务排期混乱不是因为不努力而是没有先判断“重要”与“紧急”。这个属性会在list和report命令中派上用场。3.3 日志模块让操作有迹可循个人工具也要有日志意识。什么时候添加了任务、完成了任务、生成了报告这些信息对于后续复盘很重要。日志模块尽量简单# keeper/logger.py import logging from datetime import datetime from pathlib import Path def setup_logger(log_file): path Path(log_file) path.parent.mkdir(parentsTrue, exist_okTrue) logger logging.getLogger(life_keeper) logger.setLevel(logging.INFO) if not logger.handlers: file_handler logging.FileHandler(path, encodingutf-8) file_handler.setFormatter(logging.Formatter(%(asctime)s | %(levelname)s | %(message)s)) logger.addHandler(file_handler) return logger示例日志如下2025-02-15 09:12:33 | INFO | 添加任务读 30 分钟书 2025-02-15 21:30:00 | INFO | 生成每日报告3.4 命令行入口让操作变简单命令行入口使用标准库argparse支持多个子命令# keeper/main.py import argparse from datetime import datetime from keeper.config import settings from keeper.models import Task, load_tasks, save_tasks from keeper.logger import setup_logger logger setup_logger(settings.log_file) def add_task(args): tasks load_tasks(settings.task_file) task Task(titleargs.title, importantargs.important, urgentargs.urgent) tasks.append(task) save_tasks(settings.task_file, tasks) logger.info(f添加任务{args.title}) print(f✓ 已添加任务{args.title}{task.priority}) def list_tasks(args): tasks load_tasks(settings.task_file) if not tasks: print(暂无任务。) return for index, task in enumerate(tasks, start1): status ✔ if task.done else ○ print(f{index}. [{status}] {task.title} | {task.priority} | 创建于 {task.created_at}) def done_task(args): tasks load_tasks(settings.task_file) if not 1 args.index len(tasks): print(f任务编号无效{args.index}) return task tasks[args.index - 1] task.mark_done() save_tasks(settings.task_file, tasks) logger.info(f完成任务{task.title}) print(f✓ 已完成{task.title}) def report(args): tasks load_tasks(settings.task_file) total len(tasks) done_tasks [t for t in tasks if t.done] unfinished [t for t in tasks if not t.done] done_count len(done_tasks) rate done_count / total * 100 if total else 0 print(f今日任务总结共 {total} 条已完成 {done_count} 条完成率 {rate:.1f}%) if unfinished: print(未完成) for task in unfinished: print(f - {task.title}{task.priority}) print(f{settings.nickname}记得留一点时间给自己。) def remind(args): tasks load_tasks(settings.task_file) unfinished [t for t in tasks if not t.done] now datetime.now().strftime(%Y-%m-%d %H:%M:%S) print(f[{now}] {settings.nickname}还有 {len(unfinished)} 件事没完成但先深呼吸 30 秒。) for task in unfinished[:3]: print(f - {task.title}) def build_parser(): parser argparse.ArgumentParser(description生活管理小工具) subparsers parser.add_subparsers(destcommand) add_parser subparsers.add_parser(add, help添加任务) add_parser.add_argument(title, help任务标题) add_parser.add_argument(--important, actionstore_true, help重要任务) add_parser.add_argument(--urgent, actionstore_true, help紧急任务) add_parser.set_defaults(funcadd_task) subparsers.add_parser(list, help查看任务列表).set_defaults(funclist_tasks) done_parser subparsers.add_parser(done, help完成任务) done_parser.add_argument(index, typeint, help任务编号) done_parser.set_defaults(funcdone_task) subparsers.add_parser(report, help生成每日报告).set_defaults(funcreport) subparsers.add_parser(remind, help查看未完成任务并提醒自己).set_defaults(funcremind) return parser def main(): parser build_parser() args parser.parse_args() if hasattr(args, func): args.func(args) else: parser.print_help() if __name__ __main__: main()从这段代码可以看到每个子命令都对应一个函数函数内部只做一件事读取数据、处理数据、保存数据、输出结果。这样的结构非常适合以后新增功能比如增加“删除任务”“导出周报”等。4. 完整实战案例跑通“取悦自己”系统4.1 创建项目在终端中执行mkdir life-keeper cd life-keeper mkdir config data logs keeper然后创建空文件touch keeper/__init__.py在 Windows 下如果没有touch命令可以手动新建空文件。keeper/__init__.py存在的目的是让keeper目录成为一个 Python 包这样from keeper.models import Task才能生效。4.2 添加配置和数据说明将前面给出的settings.json放入config目录。初次运行时data/tasks.json不存在也没有关系代码会自动创建。4.3 保存代码文件把config.py、models.py、logger.py、main.py分别放到对应目录。随后在life-keeper根目录运行python keeper/main.py add 读 30 分钟书 --important python keeper/main.py add 整理本周项目复盘 --important --urgent python keeper/main.py add 刷短视频 15 分钟 --urgent python keeper/main.py list预期输出类似✓ 已添加任务读 30 分钟书B-计划做 ✓ 已添加任务整理本周项目复盘A-优先做 ✓ 已添加任务刷短视频 15 分钟C-委托或快速做 1. [○] 读 30 分钟书 | B-计划做 | 创建于 2025-02-15 09:12:33 2. [○] 整理本周项目复盘 | A-优先做 | 创建于 2025-02-15 09:12:40 3. [○] 刷短视频 15 分钟 | C-委托或快速做 | 创建于 2025-02-15 09:12:474.4 完成任务并生成报告假设读完了 30 分钟的书可以标记完成python keeper/main.py done 1 python keeper/main.py report预期输出✓ 已完成读 30 分钟书 今日任务总结共 3 条已完成 1 条完成率 33.3% 未完成 - 整理本周项目复盘A-优先做 - 刷短视频 15 分钟C-委托或快速做 王悦记得留一点时间给自己。这里“刷短视频 15 分钟”被标记为紧急但不重要说明它虽然占用了时间却不值得优先投入。这样的分类能帮助你及时觉察时间去向。4.5 配置系统定时提醒命令行工具本身不会常驻后台因此我们借助操作系统的定时任务来实现提醒。Linux / macOS 使用 crontabcrontab -e添加一行表示每天 9 点到 18 点之间每 30 分钟执行一次提醒*/30 9-18 * * * cd /home/yourname/life-keeper /usr/bin/python3 keeper/main.py remind logs/cron.log 21Windows 用户可以使用“任务计划程序”打开“任务计划程序”创建基本任务触发器选择“每天”时间设为 9:00操作中选择“启动程序”程序或脚本填写 Python 路径如C:\Python39\python.exe添加参数填keeper/main.py remind起始于填项目绝对路径如D:\projects\life-keeper。这样每到整点或半点系统就会帮你输出一条“还有几件事没完成但先深呼吸 30 秒”的提醒。提醒不一定要靠打断性通知有时候命令行里的一行文字反而更能让人安静下来。5. 常见问题与排查思路5.1 运行python keeper/main.py提示找不到模块错误现象ModuleNotFoundError: No module named keeper常见原因在keeper目录内部执行了main.py导致 Python 找不到上层包__init__.py没有创建。解决思路回到项目根目录life-keeper再运行命令检查keeper/__init__.py是否存在。5.2 中文内容在 Windows 终端显示乱码常见原因Windows 默认编码与 UTF-8 不一致。解决思路在main.py开头加入import sys sys.stdout.reconfigure(encodingutf-8)或者在 PowerShell 中先执行chcp 650015.3 定时任务执行后没有反应常见原因crontab 中使用的是相对路径找不到项目目录Python 路径不对日志没有重定向看不到报错。解决思路crontab 中使用绝对路径包括项目路径和 Python 路径先手动执行一次命令确认能正常输出查看logs/cron.log排查报错。5.4data/tasks.json数据丢失常见原因误删文件手动编辑 JSON 时格式错误导致解析失败程序运行中断导致写入不完整。解决思路定期备份data目录修改 JSON 前先备份可以引入.bak机制保存当天历史副本。5.5 任务重复添加常见原因在脚本中调用add时没有去重。解决思路添加新任务前先判断标题是否已经存在如果希望严格去重可以在add_task函数中做一次检查。这里补充一个简单的去重片段放在add_task函数内部tasks load_tasks(settings.task_file) if any(t.title args.title and not t.done for t in tasks): print(f任务已存在{args.title}) return问题现象常见原因解决思路模块找不到在错误目录运行 / 缺少 init 文件回到根目录创建__init__.py中文乱码系统编码问题设置 UTF-8 编码定时任务不执行路径或 Python 环境不对使用绝对路径并检查日志数据文件丢失误删或格式错误备份与日志输出任务重复缺少去重逻辑添加标题判断6. 最佳实践与工程建议6.1 配置文件必须与代码分离个人工具规模小但长期使用后同样会面临“改需求”的问题。名字、时间、路径、提醒频率这些高频变化的内容应该放进配置文件。代码中只保留业务逻辑这样能极大降低维护成本。如果你需要管理多台电脑可以考虑把settings.json纳入 Git 仓库但把data/tasks.json加入.gitignore。这样既能同步配置又不会把个人数据提交到远端。6.2 日志是复盘的基础很多人做复盘只靠记忆这是不靠谱的。系统每天自动记录添加任务、完成任务、生成报告的时间点一周后就能回溯这一周到底花了多少时间在 A 类任务上、哪些任务被反复拖延。建议日志按天或按周切割避免单个文件过大。生产环境中的 logrotate 思路同样适用于个人工具。6.3 警惕“过度管理”这个系统叫“取悦自己”不是“压榨自己”。如果任务列表永远有 20 条未完成事项工具带来的就不是帮助而是焦虑。建议遵循“少即是多”原则每天只添加 3 到 5 个核心任务给“留白时间”预留任务比如“散步 20 分钟”完成不了就标记为未完成并复盘原因不要强行熬夜每周清理一次数据删除不再有价值的历史任务。6.4 数据安全与隐私虽然数据只存在本地但同样要考虑隐私问题。如果项目目录同步到网盘或 Git建议把data/和logs/排除掉。日志中可能包含你每天的作息、任务内容、情绪变化这些敏感信息原则上只保存在自己可控的位置。生产环境中的“最小权限原则”在这里同样适用不要给脚本设置管理员权限不要用 root 运行 crontab普通用户身份运行即可。6.5 可扩展设计这个项目最简单的扩展方向有很多增加 SQLite 存储替代 JSON 文件增加周报生成按周统计完成率增加任务分类比如“读书”“运动”“工作”“学习”增加番茄钟功能通过命令行启动一个 25 分钟倒计时接入系统通知使用notify-send或 Windows Toast 弹窗。扩展时保持现有的子命令风格比如新增stats、week、delete子命令每个函数对应一个能力整体结构不会乱。7. 总结与下一步方向本文从一个很感性的主题出发却落地为一套可以用 Python 实现的个人管理系统。核心不在于代码有多复杂而在于把“为自己做事”这个目标拆成了任务记录、优先级判断、定时提醒和数据复盘四个可执行的部分。你已经掌握了用 dataclass 定义任务模型并通过 JSON 实现本地存储用 argparse 构建命令行工具支持增删改查和报告生成用 schedule 思路配合系统 crontab 实现自动化提醒用配置文件和日志模块提高小工具的可维护性用四象限优先级帮你从“紧急但不重要”的事情中抽身。下一步建议你继续完善三个方向一是把数据存储升级为 SQLite适合长期积累数据二是增加可视化统计比如用 matplotlib 绘制每周完成率曲线三是给系统加上导出功能把每周记录整理成 Markdown 周报。工具只是手段真正重要的是你每天愿意留出一点时间给阅读、运动、思考和休息。当你亲手写完这套系统再用它记录下第一件“为自己而做”的任务时那种掌控感会比任何别人的评价都真实。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。