Python中psutil进程遍历的AccessDenied错误原因及规避方法
psutil进程遍历常见问题解答
问题1:在Python中,如何避免使用psutil.process_iter()时出现AccessDenied及其他各类错误?
可以通过以下几种方式处理:
- 捕获异常:遍历进程时,对每个进程的操作包裹
try-except块,针对性捕获psutil.AccessDenied、psutil.NoSuchProcess等异常,避免单个进程的错误中断整个遍历流程。示例代码:
import psutil for proc in psutil.process_iter(): try: # 此处执行进程相关操作 print(proc.name(), proc.cmdline()) except (psutil.AccessDenied, psutil.NoSuchProcess): continue
- 预指定属性:调用
psutil.process_iter()时传入需要获取的属性列表(如['name', 'cmdline']),psutil会批量加载这些属性,既提升效率,也能提前处理权限问题:
import psutil for proc in psutil.process_iter(['name', 'cmdline']): try: print(proc.info['name'], proc.info['cmdline']) except (psutil.AccessDenied, psutil.NoSuchProcess): continue
- 提升运行权限:部分系统核心进程或其他用户的进程需要管理员/root权限才能访问,以高权限运行脚本可减少权限相关异常。
问题2:执行以下代码遍历进程时,proc.name()始终能正常输出,但proc.cmdline()却偶尔会抛出psutil.AccessDenied异常,请问该现象的原因是什么?
代码示例:
import psutil for proc in psutil.process_iter(): print(proc.name()) # 似乎始终正常工作 print(proc.cmdline()) # 有时会触发异常
原因在于系统对进程不同属性的访问权限限制不同:
proc.name()读取的是进程的名称,属于系统公开的基础进程信息,普通用户即可访问,因此几乎不会触发权限异常。proc.cmdline()读取的是进程启动时的命令行参数,这类信息可能包含敏感内容(如密码、私有配置路径等),系统会限制普通用户访问其他用户进程或核心系统进程的命令行参数,因此访问这类进程时就会抛出psutil.AccessDenied异常。
另外,psutil采用懒加载机制,只有当调用对应方法时才会去读取系统中的进程信息,所以name()能正常返回,而cmdline()在遇到无权限的进程时才会触发错误。
内容的提问来源于stack exchange,提问作者Johnny Utahh
相关产品推荐
相关产品推荐

