Windows系统中如何获取subprocess启动的Python子进程PID
解决方法
问题根源
- 进程名显示逻辑差异:Linux系统下使用ps等命令查询进程时,默认会展示完整启动命令,因此可以直接匹配到
test.py;而Windows系统中所有Python脚本的进程映像名都为python.exe,脚本名仅作为启动参数存在,默认tasklist /v命令无法匹配参数内容,因此搜索返回空结果。 - 方法使用问题:你当前使用的
subprocess.run()是同步阻塞接口,会等待子进程完全运行结束后才返回结果,在test.py运行的10秒中该接口还未返回,无法直接拿到子进程信息。
方案1:直接在Python代码中获取子进程PID
将subprocess.run替换为非阻塞的subprocess.Popen,即可直接读取子进程PID,修改后的app.py示例:
#!/usr/bin/env python3 import subprocess command = "python" filename = "test.py" args = [command, filename] # 使用Popen非阻塞启动子进程 p = subprocess.Popen(args) # 直接获取子进程PID,就是test.py对应的Python进程PID print(f"test.py对应的进程PID为:{p.pid}") # 可选:等待子进程运行结束,和原有run逻辑保持一致 p.wait()
如果系统中Python解释器的启动命令为python3,将command变量对应修改即可。
方案2:在Windows系统命令行中查询test.py对应的PID
使用wmic命令查询Python进程的完整启动参数,即可匹配到test.py对应的PID,命令如下:
wmic process where "name='python.exe'" get processid,commandline
返回结果中会列出所有python进程的命令行和PID,找到命令行中包含test.py的条目,对应的PID就是目标进程ID。
内容的提问来源于stack exchange,提问作者Bhimasen
相关产品推荐
相关产品推荐

