如何检查Windows上一个进程是否在运行?
我正在尝试创建一个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 工具找到的。
更多信息请查看
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())