如何用Python实现运行应用检测事件监听器?及后台长期运行生产力脚本
用Python打造后台运行的专注生产力脚本
嘿,你的这个专注脚本想法超实用!已经用守护线程+while循环搭了基础框架,那咱们来把它优化得更顺手、更靠谱一些,完美实现“等待用户准备后自动开启专注模式,强制关闭分心应用”的需求~
核心思路梳理
你的方向完全没问题:后台长期运行+定时触发+实时检测进程并终止。接下来咱们把每个环节打磨得更健壮,还能兼顾跨平台兼容性。
第一步:准备依赖工具
首先得装几个好用的库,帮咱们轻松搞定进程检测、定时调度和配置管理:
pip install psutil python-dotenv schedule
psutil:跨平台的进程管理工具,不管Windows、macOS还是Linux都能用python-dotenv:把配置(比如要关闭的应用、时长)单独放在.env文件里,不用改代码就能调整schedule:简化定时逻辑,不用自己写复杂的时间判断循环
第二步:实现进程检测与关闭逻辑
用psutil可以轻松遍历所有运行中的进程,找到目标应用后终止它。这里要注意不同系统的进程名差异:比如Windows上Chrome是chrome.exe,macOS上是Google Chrome,所以代码里做了大小写统一处理,避免漏掉。
第三步:定时调度与后台运行
你用守护线程的方式很棒,可以让检测逻辑在后台持续运行而不阻塞主线程。搭配schedule库,还能轻松实现“等待30分钟后开启30分钟专注模式”的逻辑,甚至可以设置每天定时启动。
完整可运行代码
import psutil import schedule import time import os from dotenv import load_dotenv import threading # 加载配置文件,把可变参数都放在这里,改起来方便 load_dotenv() # 要关闭的分心应用进程名,逗号分隔,注意对应你的系统 DISTRACTING_APPS = os.getenv("DISTRACTING_APPS").split(",") # 用户准备时间(分钟):输入后多久开始专注 WAIT_DURATION = int(os.getenv("WAIT_DURATION", 30)) # 专注时长(分钟):持续关闭分心应用的时间 FOCUS_DURATION = int(os.getenv("FOCUS_DURATION", 30)) def kill_distracting_apps(): """终止所有目标分心应用""" for proc in psutil.process_iter(['name', 'pid']): try: # 统一转小写,避免大小写匹配问题 if proc.info['name'].lower() in [app.strip().lower() for app in DISTRACTING_APPS]: print(f"发现分心应用,正在关闭:{proc.info['name']} (PID: {proc.info['pid']})") proc.terminate() # 先尝试温和终止 time.sleep(1) # 给进程一点退出时间 # 如果还在运行,就强制终止 if proc.is_running(): proc.kill() except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): # 忽略没权限或者已经退出的进程,避免报错打断脚本 continue def start_focus_session(): """执行完整的专注流程:等待准备时间 → 启动后台检测 → 保持专注时长""" print(f"⏳ 等待{WAIT_DURATION}分钟,之后将进入专注模式!") time.sleep(WAIT_DURATION * 60) print(f"🚀 进入{FOCUS_DURATION}分钟专注模式,开始自动关闭分心应用!") # 启动守护线程,持续检测并关闭应用 def monitor_loop(): while True: kill_distracting_apps() time.sleep(10) # 每10秒检查一次,可根据需求调整 monitor_thread = threading.Thread(target=monitor_loop, daemon=True) monitor_thread.start() # 保持专注模式指定时长 time.sleep(FOCUS_DURATION * 60) print("🎉 专注模式结束啦,你可以正常使用所有应用了!") def main(): # 这里可以选择两种模式: # 1. 直接启动一次专注会话(适合手动触发) start_focus_session() # 2. 设置定时任务,比如每天上午9点自动启动(注释掉上面的,打开下面的) # schedule.every().day.at("09:00").do(start_focus_session) # print("脚本已后台运行,将在每天09:00自动启动专注模式...") # while True: # schedule.run_pending() # time.sleep(1) if __name__ == "__main__": main()
配套的.env配置文件
在脚本同目录下创建一个.env文件,把需要调整的参数放在这里:
# 要关闭的应用进程名,逗号分隔,记得对应你的操作系统 DISTRACTING_APPS=chrome.exe,Steam.exe,Discord.exe # 用户准备时间(分钟) WAIT_DURATION=30 # 专注时长(分钟) FOCUS_DURATION=30
让脚本后台悄悄运行的技巧
- Windows:用
pythonw.exe代替python.exe执行脚本,比如pythonw focus_script.py,这样不会弹出烦人的命令行窗口,脚本会在后台默默运行 - macOS/Linux:在终端执行
nohup python focus_script.py &,关闭终端后脚本依然会继续运行,操作日志会存在当前目录的nohup.out文件里
一些额外的优化小点子
- 加个系统通知:用
plyer库在专注模式开始/结束时弹出桌面通知,提醒用户状态变化 - 记录操作日志:把每次关闭应用的时间、进程名写到日志文件里,方便复盘自己的专注情况
- 增加白名单:如果需要保留某些特定进程(比如工作用的Chrome窗口),可以结合窗口标题检测(不过这个需要额外的库,比如Windows用
pywin32,macOS用pyobjc) - 权限处理:Windows下可能需要以管理员身份运行脚本才能终止某些系统级进程,macOS/Linux可能需要加
sudo
内容的提问来源于stack exchange,提问作者grizzasd




