使用psutil遍历进程时 全程运行的notepad.exe多数提示未找到
问题根因
你的代码输出逻辑和预期不匹配:当前写法是每遍历到系统里的一个进程,就立刻打印一次匹配结果,不是扫完所有进程之后再判断目标进程是否存在。
系统后台同时运行着几十上百个非记事本进程(系统服务、驱动相关进程、其他前台软件、Python解释器本身等等),遍历到这些进程时必然输出not found,只有刚好遍历到唯一的notepad.exe进程实例时才会输出一次found。你现在拿到的输出结果恰恰说明psutil正常识别到了运行中的记事本,根本不存在识别不稳定的问题,只是你给每个非目标进程都打印了“未找到”的日志,才造成了“大部分时候识别不到”的错觉。
正确写法
如果你的需求是检测系统中是否存在运行中的目标进程,不要在单进程判断分支里直接输出最终结果,先做存在标记,遍历完成后再统一输出结论。另外遍历进程时建议提前指定需要拉取的进程属性,同时做好异常捕获,避免碰到权限不足、进程遍历中途退出的情况抛错:
import psutil target_proc = "notepad.exe" proc_exist = False # 传入属性列表可以减少跨进程调用开销,遍历性能更好 for proc in psutil.process_iter(["name"]): try: if proc.info["name"].lower() == target_proc.lower(): proc_exist = True # 找到目标后直接跳出循环即可,不需要继续遍历 break except (psutil.NoSuchProcess, psutil.AccessDenied): # 遍历瞬间进程退出、或者当前用户无权访问该进程信息时直接跳过 continue print("found" if proc_exist else "not found")
补充说明
如果你本来的需求就是逐个校验每个运行中的进程是不是记事本,那现有输出是完全符合逻辑的——系统里本来就只有一个记事本进程在运行,剩下所有进程都不是目标,自然只会出现一条found记录。
注意:
psutil.process_iter()返回的是调用时刻的全量进程列表快照,不是对同一个目标进程的多次重复检测,不要把列表里的每个遍历项当成对记事本的多次识别结果。
内容的提问来源于stack exchange,提问作者whytfnotworking
相关产品推荐
相关产品推荐

