2014-10-29 93 views
3

我在windows 8.1上的python 64位上使用psutil 2.1.2。我使用psutil.process_iter()遍历正在运行的进程以获取特定进程的详细信息。由于某种原因,我不明白,即使它显示在任务管理器的进程和Process Explorer的psutil.process_iter()不会返回所有正在运行的进程

for proc in psutil.process_iter(): 
    try: 
     if proc.name() == 'svchost.exe': # patch for debugging 
      pass #script never gets here 
     opened_files = proc.open_files() 
     opened_files = [opened_file[0] for opened_file in opened_files] 
     if file_path in opened_files: 
      processes.append(proc) 
    except (psutil.AccessDenied, psutil.NoSuchProcess): 
     pass 

我检查了PROC名称,这是从来没有我在寻找的过程。 我看不到的过程的一个例子是svchost.exe

感谢您的帮助!

+0

从另一个方向看,使用从psutil.pids()获得的进程PID。 'psutil.Process(pid).open_files()'产生'psutil.AccessDenied'。在proc对象中,这个PID的BTW进程名称为None。有没有办法解决这个问题? – 2014-10-29 14:49:48

回答

2

对于一些(实际上很多)进程proc.open_files()将导致AccessDenied异常,所以可能这就是为什么你不“看到”所有进程。任务管理器和Process Explorer比psutil显示更多信息,因为它们具有较少的权限限制(请参阅:他们可以从进程中“提取”更多信息而不会碰到“访问被拒绝”错误)。通过使用psutil,您可以看到所有进程(PID),但只有您不能“查询”所有这些进程。

+0

我在代码中添加了2行 - 尽管svchost.exe正在系统上运行,但脚本永远不会达到这一点。所以我不确定proc.open_files()是否是责任。 它看起来像psutil.process_iter()不会返回所有的进程... – 2014-10-29 13:39:48

+0

proc.name()也可以提高AccessDenied。如果你说的是真的(process_iter()不返回所有的进程),那么“len(psutil.pids())”应该与“len(list(psutil.process_iter())”不同。 – 2014-10-29 15:05:09

+0

好吧,它们是相同的我认为我没有看到这个过程(或者停止在那个地方)的原因是我在使用PID时看到的进程名是'None',所以if是False,也许''open_files()'只是捕捉异常而无所作为? – 2014-10-29 15:48:29

相关问题