如何在Python中确定外部程序是否打开?

5
我正在尝试使用Python确定某个应用程序是否已经打开,以便我不会打开两次。我进行了一些研究,并发现可以获取程序的进程名称,但我对此有一个问题,即我要检查的程序本身具有相当通用的进程名称(在这种情况下是“pythonw.exe”或“cmd.exe”)。
但是,该程序在Windows任务管理器的应用程序列表中具有不同的名称,因此我的问题是是否有办法使用它来检测程序是否已经打开。我的工作场所不允许我下载其他程序或模块来用于此脚本,因此答案需要使用os模块或类似于已包含在Windows库中的内容。
2个回答

9

我使用以下代码来检查某个程序是否正在运行:

import psutil     #psutil - https://github.com/giampaolo/psutil

# Get a list of all running processes
list = psutil.pids()

# Go though list and check each processes executeable name for 'putty.exe'
for i in range(0, len(list)):
    try:
        p = psutil.Process(list[i])
        if p.cmdline()[0].find("putty.exe") != -1:
            # PuTTY found. Kill it
            p.kill()
            break;
    except:
        pass

注意:您可以使用虚拟环境安装自己的模块,或选择其他的安装路径!


谢谢,但是代码必须在除了我的机器之外的其他机器上运行,而且不能使用额外的安装程序,这就是为什么我不能使用额外的模块。 - Christian Boler
如果你真的想要移除依赖项,难道不应该使用py2exe或类似的程序吗? - trevorKirkby

2

我认为Python标准模块无法满足您的需求。需要使用一些第三方库,例如win32apiwin32pdhutilwin32con

另一种方法是使用Windows命令tasklist。使用Python作为批处理包装器,并解析tasklist的输出。

C:\Documents and Settings\Administrator>tasklist

Image Name                   PID Session Name     Session#    Mem Usage
========================= ====== ================ ======== ============
System Idle Process            0 Console                 0         28 K
System                         4 Console                 0        236 K
smss.exe                     812 Console                 0        388 K
csrss.exe                    860 Console                 0      3,720 K
winlogon.exe                 884 Console                 0      4,148 K
services.exe                 928 Console                 0      3,356 K
lsass.exe                    940 Console                 0      5,904 K
vmacthlp.exe                1100 Console                 0      2,348 K
...

在任务列表命令中加上+1,作为一名多年的Windows用户,我从未知道这一点。 - iKlsR
这是一个有用的命令,但遗憾的是PID不够一致,无法拉取特定程序。不过还是谢谢提供信息;知道这是我不能做的事情(除非使用额外的库),比到处寻找不存在的答案要好。 - Christian Boler

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