我如何知道 taskmgr 中正在运行哪个 python 脚本?

Posted

技术标签:

【中文标题】我如何知道 taskmgr 中正在运行哪个 python 脚本?【英文标题】:How do I know which python script is running in taskmgr? 【发布时间】:2012-06-04 03:16:49 【问题描述】:

似乎在任务管理器中我得到的只是python/pythonwin的进程。那么如何确定正在运行的 python 脚本呢?

【问题讨论】:

实际上 Windows Vista 和 7 已经带来了可以显示完整命令行的任务管理器。 哇,不知道!发现后,很容易开启。 【参考方案1】:

此类问题的通常答案是Process Explorer。您可以在工具提示中查看python.exepythonw.exe 的任何实例的完整命令行。

要在 Python 中获取相同的信息,您可以使用psutil module。

import psutil

pythons = [[" ".join(p.cmdline), p.pid] for p in psutil.process_iter() 
            if p.name.lower() in ("python.exe", "pythonw.exe")]

结果,pythons,是代表 Python 进程的列表列表。每个列表的第一项是启动进程的命令行,包括任何选项。第二项是进程ID。

psutil Process 类中有很多其他的东西,所以如果你想要所有这些,你可以这样做:

pythons = [p for p in psutil.process_iter() if p.name.lower() in ("python.exe", "pythonw.exe")]

现在,在我的系统上,使用psutil.process_iter() 迭代所有进程需要几秒钟,在我看来这很可笑。下面的速度明显更快,因为它在 Python 看到它之前进行了进程过滤,但它依赖于wmic 命令行工具,并非所有版本的 Windows 都有(尤其是 XP Home 缺少它)。此处的结果与第一个 psutil 版本相同(列表列表,每个列表都包含一个 Python 进程的命令行和进程 ID)。

import subprocess

wmic_cmd = """wmic process where "name='python.exe' or name='pythonw.exe'" get commandline,processid"""
wmic_prc = subprocess.Popen(wmic_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
wmic_out, wmic_err = wmic_prc.communicate()
pythons = [item.rsplit(None, 1) for item in wmic_out.splitlines() if item][1:]
pythons = [[cmdline, int(pid)] for [cmdline, pid] in pythons]

如果wmic 不可用,您将获得一个空列表[]。由于您知道至少有一个 Python 进程(您的!),您可以将其捕获为错误并显示适当的消息。

获取您自己的进程 ID,以便您可以将其排除在考虑之外,例如开始杀进程,试试pywin32的win32process.GetCurrentProcessID()

【讨论】:

在第二个 Python 进程中是否有更好的方法? 我查看了 pywin32 并没有看到任何有用的信息。我能想到的最好的办法就是掏钱给wmic。我为此添加了一些代码。 @TankorSmash:除了wmic 命令行工具之外,还提出了使用psutil 的替代方案。 我在您的答案顶部看到它,对吗?感谢您的额外努力! psutil 方法给了我“AttributeError: 'function' object has no attribute 'lower'”但 wmic 选项对我有用。【参考方案2】:

我对 kindall 的回答有一些疑问。使用 python 3.8:

import psutil
for p in psutil.process_iter():
    try: 
        if p.name().lower() in ["python.exe", "pythonw.exe"]:
            print(p.pid, p.cmdline)
    except: 
        continue

【讨论】:

【参考方案3】:

使用 Python 3:

import psutil

pythons = [[" ".join(p.cmdline()), p.pid] for p in psutil.process_iter()
        if p.name().lower() in ["python.exe", "pythonw.exe"]]

【讨论】:

@kindall 给出了同样的答案

以上是关于我如何知道 taskmgr 中正在运行哪个 python 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

windows命令——taskmgr 1

如何检查我正在运行哪个版本的 WSL2?

如何知道我的脚本在哪个 Python 实例上运行? [复制]

Windows 中的 Qt Creator - 我如何知道正在使用哪个编译器?

JavaFX:如何知道在哪个系统上运行应用程序? [复制]

boost-asio 是如何知道服务器在哪个端口上运行的?