似乎在任务管理器中我得到的只是python/pythonwin的进程。那么如何确定正在运行的 python 脚本呢?
3 回答
此类问题的通常答案是Process Explorer。您可以查看工具提示的任何实例python.exe
或pythonw.exe
工具提示中的完整命令行。
要在 Python 中获取相同的信息,您可以使用psutil 模块。
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。
psutilProcess
类中有很多其他的东西,所以如果你想要所有这些,你可以这样做:
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,因此如果您要开始杀死进程,则可以将其排除在外,请尝试 pywin32win32process.GetCurrentProcessID()
我对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
使用 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"]]