Python 如何获取由subprocess.run启动的进程的pid并终止它

Python 如何获取由subprocess.run启动的进程的pid并终止它,python,windows,subprocess,Python,Windows,Subprocess,我正在使用Windows10和Python3.7 我运行了以下命令 import subprocess exeFilePath = "C:/Users/test/test.exe" subprocess.run(exeFilePath) 使用此命令启动的.exe文件,我希望在单击按钮或执行函数时强制退出 ,已经指出强制退出的方法是获取一个PID并按如下方式执行OS.kill import signal os.kill(self.p.pid, signal.CTRL_C_EVENT) 但是,我

我正在使用Windows10和Python3.7

我运行了以下命令

import subprocess
exeFilePath = "C:/Users/test/test.exe"
subprocess.run(exeFilePath)
使用此命令启动的.exe文件,我希望在单击按钮或执行函数时强制退出

,已经指出强制退出的方法是获取一个PID并按如下方式执行OS.kill

import signal
os.kill(self.p.pid, signal.CTRL_C_EVENT)
但是,我不知道如何在subprocess.run中获取启动的进程的PID


我该怎么办?

为子流程分配一个变量

导入操作系统
输入信号
导入子流程
exeFilePath=“C:/Users/test/test.exe”
p=subprocess.Popen(exeFilePath)
打印(p.pid)#pid
os.kill(p.pid,signal.SIGTERM)#或signal.SIGKILL
在同样的情况下,这个过程有子对象 过程。您需要终止所有进程才能终止它。在这种情况下,您可以使用
psutil

#python-mpip安装-用户psutil
导入psutil
#请记住将子流程分配给变量
def杀死(pid):
''终止所有进程''
父进程=psutil.Process(pid)
对于parent.children(recursive=True)中的子级:
child.kill()
parent.kill()
#假设变量p
杀死(p.pid)

这将杀死该PID中的所有进程,因为
run
是一个阻塞调用,所以它没有意义。因此,惯用的方法不是使用run,而是创建一个子流程,然后在其上使用
kill
terminate
。这是否回答了您的问题?谢谢你回答我的问题。但是,我得到了以下错误
AttributeError:“CompletedProcess”对象没有属性“pid”
。您可以尝试
subprocess.Popen
,而不是
subprocess.run
?我可以通过这种方式启动并获取pid。谢谢。似乎比
run,call
不返回pid。Windows不维护进程树。进程只存储其父进程的PID,这允许孤立进程。杀死所有子进程的唯一可靠方法是在kill on close作业对象中运行该进程。