Python - psutil在Windows上出现权限错误?

3
我正在尝试使用psutil获取Windows 7上进程的PID,但遇到了权限错误。我已经尝试以管理员身份运行脚本的命令提示符,但似乎没有任何效果。下面是错误和相关代码。错误发生在尝试使用proc.name访问进程名称的那一行。有什么建议可以修复吗?非常感谢!
Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\psutil\_psmswindows.py", line 190, in wrapper
    return fun(self, *args, **kwargs)
  File "C:\Python33\lib\site-packages\psutil\_psmswindows.py", line 229, in get_process_exe
    return _convert_raw_path(_psutil_mswindows.get_process_exe(self.pid))
PermissionError: [WinError 5] Access is denied

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "simple_address_retrieve.py", line 14, in <module>
    if proc.name == PROCNAME:
  File "C:\Python33\lib\site-packages\psutil\_common.py", line 48, in __get__
    ret = self.func(instance)
  File "C:\Python33\lib\site-packages\psutil\__init__.py", line 341, in name
    name = self._platform_impl.get_process_name()
  File "C:\Python33\lib\site-packages\psutil\_psmswindows.py", line 190, in wrapper
    return fun(self, *args, **kwargs)
  File "C:\Python33\lib\site-packages\psutil\_psmswindows.py", line 222, in get_process_name
    return os.path.basename(self.get_process_exe())
  File "C:\Python33\lib\site-packages\psutil\_psmswindows.py", line 194, in wrapper
    raise AccessDenied(self.pid, self._process_name)
psutil._error.AccessDenied: (pid=128)

代码:

PROCNAME = "MyProcessName.exe"

for proc in psutil.process_iter():
    if proc.name == PROCNAME:
        print(proc)
2个回答

3

get_process_list()方法已经过时,请使用psutil.process_iter()方法0.6.0及以上版本。在最新的psutil版本中,这个问题似乎已经得到了解决。您也可以继续迭代进程:

for proc in psutil.process_iter():
   try:
       if proc.name == PROCNAME:
          print(proc)
   except (PermissionError, AccessDenied):
       print "Permission error or access denied on process" # can't display name or id here

来自评论区:

......进一步查找后,似乎这个问题是作者不想修复的(太复杂了):http://groups.google.com/forum/#!topic/psutil/EbdkIGlb4ls。此答案看起来是解决问题的最佳方法。虽然没有PermissionError,但可以捕获AccessDenied。


更多关于访问被拒绝的信息,请点击此处:https://groups.google.com/forum/?fromgroups=#!topic/psutil/oxAd0BuAzt0[1-25-false] - Gerrat
2
如果在尝试访问proc.name时出现了AccessDenied的错误,即使在捕获异常后,你仍然无法访问proc.name。 - Gerrat
实际上,我最先尝试了psutil.process_iter(),但是我得到了同样的错误。后来我只是使用get_process_list()来试图解决问题。所以我不认为这会解决我的情况...还是感谢你的回复... - golmschenk
此外,“AccessDenied”似乎不是一个可用的变量。我希望尝试/捕获可能只是一个特定的进程问题(而不是我正在处理的问题)。然而,PermissionError本身无法捕捉该问题。有什么想法吗? - golmschenk
我已经下载了适用于Python 2.7的最新64位二进制文件psutil,并且它仍然存在这个问题(尽管工具的作者说已经修复了)。:( - Gerrat
1
...在更多搜索后,看起来这是一个作者不会修复的问题(太复杂):https://groups.google.com/forum/#!topic/psutil/EbdkIGlb4ls。这个答案似乎是解决这个问题的最佳方法。虽然没有`PermissionError`,但只需捕获`AccessDenied`即可。 - Gerrat

0
除了psutil.AccessDenied: # windows
例子
def test_children_duplicates(self):
        # find the process which has the highest number of children
        table = collections.defaultdict(int)
        for p in psutil.process_iter():
            try:
                table[p.ppid()] += 1
            except psutil.Error:
                pass
        # this is the one, now let's make sure there are no duplicates
        pid = sorted(table.items(), key=lambda x: x[1])[-1][0]
        p = psutil.Process(pid)
        try:
            c = p.children(recursive=True)
        except psutil.AccessDenied:  # windows
            pass
        else:
            self.assertEqual(len(c), len(set(c))) 

参考:https://www.programcreek.com/python/example/53869/psutil.process_iter

def find_process(regex):
    "If 'regex' match on cmdline return number and list of processes with his pid, name, cmdline."
    process_cmd_name = re.compile(regex)
    ls = []
    for proc in psutil.process_iter(attrs=['pid','name','cmdline']):
        try:
            if process_cmd_name.search(str(" ".join(proc.cmdline()))):
                ls.append(proc.info)
        except psutil.AccessDenied:  # windows
            pass
    return (ls)

在使用psutil.AccessDenied时,可能会与列表推导式结合使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接