如何让定时检测的Python脚本启动其他脚本后无需等待其结束?
嘿,这个问题我之前也碰到过!核心原因就是你启动脚本2的时候用了会阻塞主进程的方法(比如subprocess.run()),导致脚本1得等脚本2执行完才继续跑自己的循环,结果俩脚本都卡住了。下面给你几个靠谱的解决办法:
1. 用subprocess.Popen()异步启动脚本2
Popen是subprocess模块里的异步启动方法,它会直接创建子进程运行脚本2,不会阻塞脚本1的主循环。如果还要实时显示脚本2的终端输出,咱们可以用线程来读取子进程的输出流:
import subprocess import time import threading def is_script2_running(): # 这里实现检测脚本2是否运行的逻辑,基于psutil库实现更可靠的进程判断 import psutil for proc in psutil.process_iter(['cmdline']): try: if 'script2.py' in proc.info['cmdline']: return True except (psutil.NoSuchProcess, psutil.AccessDenied): continue return False def print_script2_output(proc): # 实时读取并打印脚本2的输出 for line in iter(proc.stdout.readline, ''): if line: print(f"[Script2] {line.strip()}") def start_script2(): # 启动脚本2,捕获stdout和stderr proc = subprocess.Popen( ["python", "script2.py"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, # Linux/macOS下添加该参数,让脚本2独立于脚本1运行,避免脚本1退出时被连带终止 # start_new_session=True, # Windows下如果想让脚本2在新终端窗口运行,启用下面的参数 # creationflags=subprocess.CREATE_NEW_CONSOLE ) # 启动线程处理输出,daemon=True确保脚本1退出时该线程也会终止 threading.Thread(target=print_script2_output, args=(proc,), daemon=True).start() # 脚本1的主循环:每3分钟检测一次 if __name__ == "__main__": while True: if not is_script2_running(): print("Script2未运行,正在启动...") start_script2() time.sleep(180) # 3分钟=180秒
2. 更可靠的进程检测:用psutil库
上面的检测逻辑用到了psutil,这是一个跨平台的进程管理库,比直接调用系统命令(如ps/tasklist)更稳定准确。安装它很简单:
pip install psutil
它能精准读取进程的命令行参数,避免误判同名进程。
3. 额外优化建议
- 如果你的脚本2是GUI程序或者需要独立终端交互,Windows下可以启用
creationflags=subprocess.CREATE_NEW_CONSOLE,这样脚本2会在新的终端窗口运行,输出直接显示在那里,无需额外线程读取。 - Linux/macOS下添加
start_new_session=True,可以让脚本2脱离脚本1的进程组,即使脚本1意外退出,脚本2也能继续运行。
这样修改后,脚本1的主循环会一直按3分钟间隔执行检测,启动脚本2后会立刻回到自身任务,再也不会等着脚本2结束啦!
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

