我有一个python脚本启动一个应用程序,并抓住PID,并等待,直到该过程ID不再使用find:
result = subprocess.Popen( r'tasklist /fi "PID eq ' + str(PID) + '"', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
这对我来说工作得很好,直到我尝试在XP Home上运行它,当然,没有tasklist.exe
是否有另一种方法来检测进程是否正在运行,给定进程的PID。
只需启动subprocess.Popen并等待它完成的过程不是一个选项,因为进程必须分离,因为我需要在初始进程运行时执行其他任务。
有什么想法吗?
如果您不介意安装Python Win32扩展 ,则可以使用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)
当然,在这种情况下,错误处理代码(省略)稍微复杂一点,Pythonic也少得多。
你可以尝试使用WMIC。 我认为它在XP Home中可用。 这里是命令:
wmic process get description,executablepath,processid