我怎么知道taskmgr中运行的是哪个python脚本?

时间:2012-06-04 03:16:50

标签: python windows taskmanager

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

3 个答案:

答案 0 :(得分:9)

这些问题的通常答案是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()

答案 1 :(得分:0)

我对 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

答案 2 :(得分:-1)

使用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"]]