You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动