Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows操作系统上,如何根据python中的PID确定正在运行的进程?_Python_Windows_Windows Xp_Pid_Tasklist - Fatal编程技术网

在Windows操作系统上,如何根据python中的PID确定正在运行的进程?

在Windows操作系统上,如何根据python中的PID确定正在运行的进程?,python,windows,windows-xp,pid,tasklist,Python,Windows,Windows Xp,Pid,Tasklist,我有一个python脚本,它启动一个应用程序,并获取PID,然后使用以下命令等待,直到不再找到该进程ID: result = subprocess.Popen( r'tasklist /fi "PID eq ' + str(PID) + '"', stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 这对我来说很好,直到我尝试在XP Home上运行它,当然,XP Home没有tasklist.exe 在给定流程PID的情况下,是否有其他方法可以检测

我有一个python脚本,它启动一个应用程序,并获取PID,然后使用以下命令等待,直到不再找到该进程ID:

result = subprocess.Popen( r'tasklist /fi "PID eq ' + str(PID) + '"', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
这对我来说很好,直到我尝试在XP Home上运行它,当然,XP Home没有tasklist.exe

在给定流程PID的情况下,是否有其他方法可以检测流程是否正在运行

简单地使用subprocess.Popen启动流程并等待其完成不是一个选项,因为在初始流程运行时,我需要执行其他任务,因此必须分离流程


有什么想法吗?

您可以尝试使用WMIC。我认为它在XP Home中可用。命令如下:

wmic process get description,executablepath,processid

如果不介意安装,可以使用Windows API等待进程退出,如下所示:

from win32con import SYNCHRONIZE
from win32event import WaitForSingleObject, INFINITE
from win32api import OpenProcess, CloseHandle

process_handle = OpenProcess(SYNCHRONIZE, False, pid)
try:
    WaitForSingleObject(process_handle, INFINITE)
finally:
    CloseHandle(process_handle)
这将导致代码阻塞,直到进程退出(如果需要,可以更改
WaitForSingleObject()
中的
INFINITE
值;请参阅)


或者,在不安装扩展的情况下,您可以使用
ctypes
执行此操作,特别容易,因为所有必要的方法都在
kernel32.dll
中:

from ctypes import windll

SYNCHRONIZE = 0x100000L
INFINITE    = 0xFFFFFFFFL

process_handle = windll.kernel32.OpenProcess(SYNCHRONIZE, 1, pid)
windll.kernel32.WaitForSingleObject(process_handle, INFINITE)
windll.kernel32.CloseHandle(process_handle)

当然,在这种情况下,错误处理代码(省略)要复杂一点,而且远没有python那么复杂。

您可能希望在python中使用psutil库并使用psutil.pid_exists(pid)来检查进程是否正在运行。除非您必须只使用子进程,否则您是否有一个如何使用它的示例?导入psutil.pid_exists(pid),如果pid存在,它将返回true,否则返回FALSE XP Home是否有taskmgr.exe,如果有,为什么它有taskmgr.exe而没有tasklist.exe?在我看来,没有理由使用GUI版本,而不是CLI版本。。。此外,您是否可以从非家用XP计算机复制XP版本的tasklist.exe?如果它能工作的话,我会很感兴趣…@user1351549它解决了你的问题吗?不幸的是XP Home上没有它