如何获取Python子进程启动的二级进程Y.exe的PID?
如何获取X.exe启动的Y.exe的PID?
可以实现,核心思路是利用父子进程的关联关系——Y.exe是X.exe的子进程,因此它的父进程ID(PPID)会等于X.exe的PID。下面是两种可行方案:
方案一:使用psutil库(推荐)
psutil是Python的跨平台进程管理库,能轻松遍历系统进程并获取进程的父子关系。
- 先安装依赖:
pip install psutil
- 编写代码实现:
from subprocess import Popen import psutil import time # 启动X.exe并记录其PID x_process = Popen('D:\\X.exe') x_pid = x_process.pid # 等待Y.exe启动(根据实际启动耗时调整等待时间) time.sleep(8) # 遍历所有进程,筛选父PID为X.exe PID的Y.exe进程 for proc in psutil.process_iter(['pid', 'name', 'ppid']): try: proc_info = proc.info # 匹配父PID和进程名(如果Y.exe有固定名称的话) if proc_info['ppid'] == x_pid and proc_info['name'] == 'Y.exe': print(f"找到Y.exe的PID:{proc_info['pid']}") except (psutil.NoSuchProcess, psutil.AccessDenied): # 跳过无权限访问或已结束的进程 continue
如果Y.exe的名称不固定,也可以只通过父PID筛选,再结合其他特征(比如进程路径)进一步确认,不过需要补充相关信息。
方案二:使用Windows原生命令(无需第三方库)
如果不想安装psutil,可以调用Windows的wmic命令查询子进程,再解析输出结果:
from subprocess import Popen, PIPE import time x_process = Popen('D:\\X.exe') x_pid = x_process.pid time.sleep(8) # 调用wmic命令查询父PID为x_pid的进程 cmd = f'wmic process where parentprocessid={x_pid} get processid, name' result = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True).stdout.read() # 解析输出结果 lines = [line.strip() for line in result.split('\n') if line.strip()] for line in lines[1:]: # 跳过表头行 pid, name = line.split() print(f"进程名:{name},PID:{pid}")
这种方法需要处理命令输出的格式,容错性不如psutil,但无需额外依赖。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

