【问题标题】:Why am I getting access denied when program is not running?为什么程序未运行时访问被拒绝?
【发布时间】:2021-06-13 06:17:57
【问题描述】:

我有一段简单的代码主要来自answer,并做了一些调整:

import psutil

try:
    if "firefox.exe" in (p.name() for p in psutil.process_iter()):
        print('Firefox is running')
    else:
        print('Firefox is not running')
except Exception as e:
    print(e)

如果在我运行此代码时 Firefox 正在运行,它会打印预期的 Firefox is running。但如果 Firefox 没有运行,我会得到 psutil.AccessDenied (pid=9092) 而不是预期的 Firefox is not running

我还注意到,如果firefox.exe 拼写错误,我会再次收到AccessDenied 错误。我可以只在except 块内使用print('Firefox is not running'),但这似乎不太聪明。

有人知道为什么会这样吗?

【问题讨论】:

  • 因为你没有权限获取PID 9092的名字。
  • 我该如何解决这个问题?以管理员身份运行?
  • 既然您已经测试过firefox运行时它可以正常工作,只需处理权限错误异常并打印不运行即可。
  • 对。你不关心特权进程是什么。你只关心你没有看到 Firefox。
  • 一个问题,PermissionError 没有捕捉到psutil.AccessDenied (pid=9092) 错误

标签: python psutil


【解决方案1】:

process_iter() 允许您指定应返回的属性。所以告诉它只返回名称,然后比较它们。

if any(p.info['name'] == "firefox.exe" for p in psutil.process_iter(['name'])):

从文档中得到这个:

Find process by name

【讨论】:

  • 已修复。需要使用p.info
【解决方案2】:

因为 (p.name() for p in psutil.process_iter()) 是一个生成器,当进程没有在用户进程中被发现时,它会尝试列出系统进程。考虑使用 print('Firefox is not running by current user') 之类的警告来抑制此异常

我得到 psutil.AccessDenied (pid=9092)

其他可能的原因是在迭代器获取 pid 后进程被终止。由于您无法确定当您的 python 进程被操作系统调度程序挂起时该进程不会消失,因此无知似乎是一个合法的解决方案。

UPD: aaand 就是这样(产生了死进程) https://github.com/giampaolo/psutil/blob/c3e63b4dd59f1724a7fa29371e53dfa7f46cbcd3/psutil/__init__.py#L1453-L1465

当您尝试访问进程名称(未缓存)时,它已经死了。所以我会跳过它而不是表现得像它正在运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2023-03-07
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多