如何检查Windows上一个进程是否在运行?

75 投票
22 回答
229001 浏览
提问于 2025-04-17 04:26

我正在尝试创建一个Python脚本,之后会把它作为服务运行。现在我想让代码的某个部分只在iTunes运行时执行。我了解到,从整个命令列表中轮询(也就是检查)然后再搜索特定应用程序是比较耗费资源的。

我发现,在基于UNIX的操作系统中,程序会创建一个锁文件来通知系统某个程序正在运行,这时我们可以使用os.stat(location_of_file)来检查这个文件是否存在,从而判断程序是否在运行。

那么在Windows上有没有类似的锁文件呢?

如果没有,Python中有哪些方法可以用来判断一个进程是否在运行呢?

我使用的是Python 2.7和iTunes的COM接口。

22 个回答

10

win32ui.FindWindow(classname, None) 这个命令会返回一个窗口的句柄,如果找到了任何一个符合给定类名的窗口。如果没有找到,就会抛出一个 window32ui.error 的错误。

import win32ui

def WindowExists(classname):
    try:
        win32ui.FindWindow(classname, None)
    except win32ui.error:
        return False
    else:
        return True

if WindowExists("DropboxTrayIcon"):
    print "Dropbox is running, sir."
else:
    print "Dropbox is running..... not."

我发现 Dropbox 的托盘图标的窗口类名是 DropboxTrayIcon,这是我用 Autohotkey Window Spy 工具找到的。

更多信息请查看

MSDN FindWindow

28

虽然@zeller已经提到过了,这里给大家举个例子,讲讲怎么用 tasklist。因为我刚好在找一些原生 Python 的替代方案……

import subprocess

def process_exists(process_name):
    call = 'TASKLIST', '/FI', 'imagename eq %s' % process_name
    # use buildin check_output right away
    output = subprocess.check_output(call).decode()
    # check in last line for process name
    last_line = output.strip().split('\r\n')[-1]
    # because Fail message could be translated
    return last_line.lower().startswith(process_name.lower())

现在你可以这样做:

>>> process_exists('eclipse.exe')
True

>>> process_exists('AJKGVSJGSCSeclipse.exe')
False

为了避免多次调用这个,并且能更清楚地看到所有的进程,你可以这样做:

# get info dict about all running processes
import subprocess
output = subprocess.check_output(('TASKLIST', '/FO', 'CSV')).decode()
# get rid of extra " and split into lines
output = output.replace('"', '').split('\r\n')
keys = output[0].split(',')
proc_list = [i.split(',') for i in output[1:] if i]
# make dict with proc names as keys and dicts with the extra nfo as values
proc_dict = dict((i[0], dict(zip(keys[1:], i[1:]))) for i in proc_list)
for name, values in sorted(proc_dict.items(), key=lambda x: x[0].lower()):
    print('%s: %s' % (name, values))
106

在Linux或Windows系统中,你不能完全依赖锁定文件。我的建议是直接去检查所有正在运行的程序。我觉得这样做并不会像你想的那么“费劲”。psutil是一个很棒的跨平台Python模块,可以列出系统上所有正在运行的程序。

import psutil    
"someProgram" in (p.name() for p in psutil.process_iter())

撰写回答