在64位Windows上列出正在运行的进程

15

我正在编写一个小的Python脚本,它将获取我运行的Windows虚拟机中的信息。

目前,我可以通过以下方法列出32位XP计算机上的进程:

http://code.activestate.com/recipes/305279/

是否有可能在检测到运行的Windows版本后执行不同的方法来获取64位机器上的进程?我正在尝试获取64位Vista和64位Windows 7上的进程。

有任何想法吗?

5个回答

28

27

这里有另外一个使用 Performance Data Helper 库 (PDH) 来实现类似功能的方案。

我已在 Windows 7 64位系统上测试通过,因此应该该函数适用于32位和64位的Windows。

你可以在这里找到该方案:http://code.activestate.com/recipes/303339/

另一种方法是使用WMI,在Python中有一个使用wmi模块的示例:

http://timgolden.me.uk/python/wmi/cookbook.html

import wmi
c = wmi.WMI ()

for process in c.Win32_Process ():
  print process.ProcessId, process.Name

WMI在64位Windows上也能工作吗?我在他们的网站上没有看到任何提到64位的内容,或者你使用相同的方法名称吗? - RailsSon
它应该以相同的方式工作(包括方法)名称适用于两个环境。 - Andre Miller
我一直在我的应用程序中使用这种方法,但是当这个查找被触发时,我们注意到了显著的CPU峰值。起初我以为是我正在使用的调度程序,但是我开始注释掉代码,直到我到达了这个特定的代码。注释掉后,没有显著的峰值。你有什么想法吗? - Sherd
我应该补充一下,Jonathan Rocher发布的方法没有这个问题,并且具有跨平台的优点。 - Sherd
pip install wmi 似乎成功了,并且反映在链接网站上发布的版本。 - luckydonald
如果你遇到了类似于“找不到模块win32something”的错误,那么请从这里安装正确版本的pywin32。 - luckydonald

11

我找到了最干净的解决方法,就是使用psutil库,正如Robert Lujo所推荐的:

psutil.process_iter()

请注意,它返回一个生成器对象,一次发出一个进程对象。例如,如果您需要进程名称列表,可以执行以下操作:

Note that it returns a generator object, issuing a process object at a time. For example if you need the list of process names, you can do something like:

[p.name() for p in psutil.process_iter()]

嗨,那个不错,我有一个问题,因为p是一个带有pid和name的进程,为什么要用括号获取p.name()?如果我想要获取pids,为什么它不起作用?我正在尝试获取匹配的pid/name。 - A.Joly

9

5
psutil 限制其输出的进程仅限于运行 Python 脚本的当前用户。因此,非管理员用户将无法看到特权进程。 - rosch

0

1
使用类似win32process或psutils这样的工具要比从命令行命令中输出管道更好得多。有意与Python集成的东西总是更容易、更干净。 - trevorKirkby

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